Переделать обработку красных строк #15

Closed
opened 2025-01-04 22:04:16 +00:00 by grigorevde · 2 comments
grigorevde commented 2025-01-04 22:04:16 +00:00 (Migrated from git.csit.sgu.ru)

В злосчастном http://git.csit.sgu.ru/grigorevde/typst-template/-/issues/13#issuecomment-2571420395, конечно, было найдено временное решение с https://forum.typst.app/t/how-to-indent-every-paragraph-excluding-headings/2137/2, но меня очень напрягает необходимость дублировать один и тот же код, например, для заголовков и для таблиц. Было бы неплохо найти более надёжный вариант для неубирания красных строк.

В злосчастном http://git.csit.sgu.ru/grigorevde/typst-template/-/issues/13#issuecomment-2571420395, конечно, было найдено временное решение с https://forum.typst.app/t/how-to-indent-every-paragraph-excluding-headings/2137/2, но меня очень напрягает необходимость дублировать один и тот же код, например, для заголовков и для таблиц. Было бы неплохо найти более надёжный вариант для неубирания красных строк.
grigorevde commented 2025-01-05 09:16:39 +00:00 (Migrated from git.csit.sgu.ru)

По идее, работающий вариант решения должен выглядеть примерно так (это не рабочий код, просто сама идея):

#let indent = 1em
#let styled = [#set text(red)].func()
#let space = [ ].func()
#let sequence = [].func()

#let turn-on-first-line-indentation(
  doc,
  last-is-heading: false, // space and parbreak are ignored
  indent-already-added: false,
) = {
  if tyle(doc) == content {
    for (i, elem) in doc.children.enumerate() {
      turn-on-first-line-indentation(doc, last-is-heading: last-is-heading, indent-already-added: indent-already-added)
    }
    return
  }
  let element = elem.func()
  if element == text {
    let previous-elem = doc.children.at(i - 1)
    if i == 0 or last-is-heading or previous-elem.func() == parbreak {
      if not indent-already-added {
        indent-already-added = true
        h(indent)
      }
    }
    elem
  } else if element == heading {
    indent-already-added = false
    last-is-heading = true
    elem
  } else if element == space {
    elem
  } else if element == parbreak {
    indent-already-added = false
    elem
  } else if element == sequence {
    turn-on-first-line-indentation(
      elem,
      last-is-heading: last-is-heading,
      indent-already-added: indent-already-added,
    )
  } else if element == styled {
    styled(turn-on-first-line-indentation(
      elem.child,
      last-is-heading: last-is-heading,
      indent-already-added: indent-already-added,
    ), elem.styles)
  } else {
    indent-already-added = false
    last-is-heading = false
    elem
  }
}

#show: turn-on-first-line-indentation

В таком случае мы заранее убедимся, что doc является content и пройдёмся циклом по его детям, а в противном случае будем считать, что мы уже работаем с детьми. Прежде чем что-то предпринимать, я бы дождался комментариев автора оригинального кода, потому что вперёд батьки в пекло переть не хочется, мне его авторитет не позволяет.

По идее, работающий вариант решения должен выглядеть примерно так (это не рабочий код, просто сама идея): ```typ #let indent = 1em #let styled = [#set text(red)].func() #let space = [ ].func() #let sequence = [].func() #let turn-on-first-line-indentation( doc, last-is-heading: false, // space and parbreak are ignored indent-already-added: false, ) = { if tyle(doc) == content { for (i, elem) in doc.children.enumerate() { turn-on-first-line-indentation(doc, last-is-heading: last-is-heading, indent-already-added: indent-already-added) } return } let element = elem.func() if element == text { let previous-elem = doc.children.at(i - 1) if i == 0 or last-is-heading or previous-elem.func() == parbreak { if not indent-already-added { indent-already-added = true h(indent) } } elem } else if element == heading { indent-already-added = false last-is-heading = true elem } else if element == space { elem } else if element == parbreak { indent-already-added = false elem } else if element == sequence { turn-on-first-line-indentation( elem, last-is-heading: last-is-heading, indent-already-added: indent-already-added, ) } else if element == styled { styled(turn-on-first-line-indentation( elem.child, last-is-heading: last-is-heading, indent-already-added: indent-already-added, ), elem.styles) } else { indent-already-added = false last-is-heading = false elem } } #show: turn-on-first-line-indentation ``` В таком случае мы заранее убедимся, что doc является content и пройдёмся циклом по его детям, а в противном случае будем считать, что мы уже работаем с детьми. Прежде чем что-то предпринимать, я бы дождался комментариев автора оригинального кода, потому что вперёд батьки в пекло переть не хочется, мне его авторитет не позволяет.
grigorevde commented 2025-01-05 10:43:06 +00:00 (Migrated from git.csit.sgu.ru)

Just don't use it, or create your own from scratch for your document. Or good luck fixing my mess! ;)

Я думаю, это достаточно красноречивый ответ

> Just don't use it, or create your own from scratch for your document. Or good luck fixing my mess! ;) Я думаю, это достаточно красноречивый ответ
grigorevde (Migrated from git.csit.sgu.ru) closed this issue 2025-01-05 10:43:06 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
grigorevde/typst-template#15
No description provided.