0 голосов
626 просмотров

Есть ли способ вернуться на сетку, если вы с неё сошли? Или как-то вывести текст из сетки, при этом «в фоне» продолжая отслеживать её положение?

Первые страницы моих книг оформлены так:

MAIN TITLE
introductory outline (with \io markers)
\s
\p

Проблема возникает из-за раздела \io. Я хочу, чтобы размер шрифта и межстрочный интервал в этом разделе были меньше обычного, но если я это делаю, то \s и \p оказываются вне сетки. Я могу исправить это с помощью \vskip, но поскольку во введении каждой книги разное количество строк, значение \vskip будет разным для каждой книги. (Теперь, когда я это записал, если нет способа вернуться на сетку, возможно, я смогу решить проблему, написав change или sethook для каждой книги.)

Переведено машиной с языка English
PTXprint от (1,9тыс. очков) | 626 просмотров

2 Ответов

0 голосов

Ну… есть \parlines, который TeX использует, чтобы сообщить, сколько строк было в абзаце.
Думаю, код в конце абзаца мог бы выполнить некоторые подсчёты и вычисления…

Переведено машиной с языка English
от (1,1тыс. очков)

Аргх. Простите, в моём предыдущем ответе было две довольно крупные ошибки.

  1. \@parlines — это часть учёта, который мы используем для расчёта «выпавших» глав и т. д., мне следовало написать \prevgraf
  2. \prevgraph даёт вам почти то, что вам нужно — умножьте величину смещения от сетки на это значение, и при условии, что нет других отступов, полей перед/после и т. д., вы получите «смещение на X pt», которое можно использовать для возврата на сетку, предварительно убедившись, что это значение положительное и меньше одной линии сетки. Всё это сработает при первом прогоне TeX. НО здесь есть огромная оговорка:
    Всё это хорошо, пока ваш предыдущий текст вне сетки никогда не разбивается на страницы. В такой момент все тщательные расчёты нужно отбросить, потому что весь текст на странице начинается с первой базовой линии. И без обработки типа @parlines вы не знаете, сколько строк этого абзаца где-то посреди текста находятся на новой странице.

Так что… подумав ещё немного, я не могу придумать способа сделать это при наличии переносов на новую страницу без прямого участия файла .parlocs, и в этом случае будет проще сказать: «Я хочу, чтобы этот абзац (курсор сейчас в точке X,Y) находился на сетке», и не bother считать абзацы вообще. Хотя бы для первого перехода.
Затем потребуется повторный прогон TeX, если текст вне сетки. Минус в том, что это может изменить точки разбивки страниц и расположение рисунков/сносок, потенциально требуя >= одного повторного прогона на каждый переход! (Ой, если речь идёт о всей Библии!)

Переведено машиной с языка English
0 голосов

Я думаю, что это достаточно распространённая проблема для МНОГИХ людей, поэтому, вероятно, нам следует автоматически возвращать текст на сетку после окончания введения и начала первой главы. (Можно ли сделать это программно, чтобы пользователям не приходилось этим заниматься?)

Переведено машиной с языка English
от (3,2тыс. очков)

Моя огромная оговорка применима, если мы хотим, чтобы это работало во всех ситуациях. Учитывая, что у людей могут быть многостраничные введения, я думаю, что нам фактически нужно будет: (a) пронумеровать каждый абзац с нестандартным интервалом, а также любые последующие абзацы на полную страницу, (b) рассчитать, какой абзац будет разбит и на какой строке абзаца был рассчитан разрыв. (c) запомнить это для следующего прогона, когда мы дойдём до «восстановления сетки».

Альтернатива — это то, что мы делаем сейчас при переходе от одной колонки к двум: частично заполненная страница набирается, становится фиксированной, и другие материалы добавляются ниже. Это вызывает другие проблемы в режиме двух колонок, например… с выравниванием.

Переведено машиной с языка English

В любой данный момент времени TeX не знает, где он находится на странице? Он знает только своё положительное значение относительно предыдущей строки? Я не понимаю, почему нет способа сказать: «номер главы находится на y-значении a, следующая линия сетки находится на y-значении b, и поэтому нам нужно сдвинуть базовую линию главы вниз на b-a».

Альтернатива — это то, что мы делаем сейчас при переходе от одной колонки к двум: частично заполненная страница набирается, становится фиксированной, и другие материалы добавляются ниже.

На самом деле, в проекте, который вызвал этот вопрос, и введение, и основной текст в одну колонку. Могу ли я сделать это вручную — закрыть страницу и начать новую ниже?

Переведено машиной с языка English

TeX готовит «галерею» (непрерывную колонку абзацев и интервалов) целиком до того, как решает, как разбить её на страницы. Он всегда завершает абзац, прежде чем проверить, складывается ли всё в галерее в страницу, и хотя он пытается сделать разумное предположение о том, когда запускать разбивку на страницы, эти предположения не полностью точны: чтобы получить выравнивание колонок, сноски, перекрёстные ссылки, рисунки и боковые панели, а также единообразные окончания страниц, нам часто приходится пробовать более короткие отрезки галереи. Таким образом, на новой странице может быть целая куча текста, рисунков и сносок, ожидающих в её галерее при старте.

Когда начинается абзац (точка, в которой вам пришлось бы добавить дополнительное пространство), \pagegoal и \pagetotal известны, но, по сути, это лишь предположения, и программа не знает, например, какие изображения могут быть добавлены поверх страницы, или будет ли вызов к растяжению чего-либо гибкого.

Да, должно быть возможно заставить его закрыть частичную страницу, но, вероятно, не вручную. Также есть некоторые побочные эффекты, которые могут оказаться настоящей головной болью.
Мне только что пришло в голову, что одним из вариантов было бы использовать растяжимые интервалы, немного как это:

Stretch to page height{
  {figures}
  Stretch to 35 normal lines{
    {Intro paragraph (13.4 normal lines)}
    {stretchy bit}
    {main text (21 lines)}
  }
  {stretchy bit}
  {footnotes}
}

(Новым элементом является «Stretch to 35 lines» для средней секции, и, конечно, «35 lines» нужно будет рассчитать на основе нерастянутой длины текстового блока.)
@Martin_Hosken, возможно, захочет прокомментировать, почему это глупая идея, хотя.

Переведено машиной с языка English

Офлайн Дэвид предложил \par\layoutstylebreak. Это не сработало, но, посмотрев, как это использовалось в других документах, я в итоге попробовал \singlecolumn, и это работает!!! Даже несмотря на то, что я переключаюсь из одной колонки в одну колонку, этого, похоже, достаточно, чтобы сбросить сетку.


Это решение подняло ещё один вопрос:

Мой документ .sfm теперь выглядит так:

\io a bunch of introductory outline rows
\\p ~
\zgetbackongrid\*
\s The first section title

а в моём файле *mods.text есть это:

\sethook{end}{zgetbackongrid}{\singlecolumn}

Но я не могу заставить это работать без строки \\p ~, которая затем добавляет лишнюю пустую строку, которой я не хочу. Я предполагаю, что проблема в том, что мой маркер zgetbackongrid всё ещё находится внутри абзаца \io, но я не могу понять, как выйти из этого абзаца, не добавляя лишнюю строку. \par, который Дэвид изначально предложил в сочетании с layoutstylebreak, похоже, не разрешён внутри sethook.

Переведено машиной с языка English

Если \zgetbackongrid\* — это в остальном пустой маркер, вы можете пойти на всё и попробовать заставить его расширяться, чтобы выполнять действия внутри (без гарантий, я это не тестировал):

\expandafter\def\csname MS:zgetbackongrid\endcsname{\par\singlecolumn}

Это может не сработать. Код маркера ожидает, что он (в лучшем случае) будет генерировать некоторый символьный текст, и в нём есть различные сложные части, чтобы обеспечить, чтобы настройки стилей и т. д. не «выскакивали».

Переведено машиной с языка English

Использование вашего кода не вызвало ошибки от \par, но, похоже, оно также не сбрасывало сетку так, как это делало использование \p в файле .sfm.

Однако следующее в итоге сработало, и поэтому я думаю, что я могу сбросить сетку, не имея лишнего пробела:
Поставьте \p ~ в файле sfm.
В файле *mods.tex используйте это:
\sethook{end}{zgetbackongrid}{\vskip-1\baselineskip\singlecolumn}

Спасибо за всю вашу помощь.

Переведено машиной с языка English

Связанные вопросы не найдены

Welcome to Support Bible, where you can ask questions and receive answers from other members of the community.
Very truly I tell you, whoever accepts anyone I send accepts me; and whoever accepts me accepts the one who sent me.
John 13:20
3,064 вопросов
6,024 ответов
5,695 комментариев
2,036 пользователей