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

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

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

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

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

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

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.
I urge you, brothers and sisters, to watch out for those who cause divisions and put obstacles in your way that are contrary to the teaching you have learned. Keep away from them.
Romans 16:17
3,046 вопросов
6,006 ответов
5,671 комментариев
2,027 пользователей