%20%D0%B8%D0%B7%20Lua%20%D0%B2%20LuaTeX%3F.png)
Я пишу (участвую в разработке) пакет LuaLaTeX, в котором функция Lua используется для генерации изображений, вставляемых в документ LaTeX.
Одна часть информации, которая нам нужна, — это текущий номер страницы, чтобы определить, находимся ли мы на четной или нечетной странице (я знаю, что это не так уж и тривиально, и я знаю о некоторых стратегиях за пределами \thepage
). Мы устанавливаем переменную Lua, когда мы все еще находимся в части LaTeX, и пока это работает довольно хорошо.
Однако теперь выясняется, что последовательность создаваемых нами изображений может быть распределена по нескольким страницам, и нам бы очень хотелось это отразить, поскольку наши изображения могут вести себя по-разному на четных и нечетных страницах.
По сути, у нас есть ряд
tex.print('\\includegraphics{something}\\par')
операторы, выполняемые в цикле внутри одной функции Lua.
Теперь вопрос: есть ли способ напрямую обнаружить смену страницы между двумя такими графиками или многократно извлекать текущую страницу в таком цикле?
Все решения, которые я нашел для определения текущего нечетного или четного состояния, находятся в самом LaTeX. Я знаю, как использовать \directlua
для извлечения значения для использования в LaTeX, но есть ли способ сделать наоборот - извлечь значение LaTeX из LUa?
Редактировать:в ответ на комментарий и ответ TeXnician: Когда я изменяю код примера так, чтобы он создавал повторы абзацев, похоже, счетчик страниц не обновляетсяв пределах одного фрагмента Lua:
\documentclass{article}
\newcommand\printluapage{%
\directlua{for i = 1, 60 do tex.print(tex.count['c@page'])
tex.print([[\par]]) end}
}
\begin{document}
\printluapage
New command
\printluapage
New command
\printluapage
\end{document}
Номер страницы обновляется только при каждом новом вызове \printluapage
.
решение1
Вы почти никогда не можете точно сослаться на счетчик страниц из основного документа, только во время процедуры вывода, где отправляемая страница точно известна. Luatex не изменяет базовую модель способа вывода страниц TeX, поэтому то же самое применимо и к luatex.
В вашем цикле lua вы можете использовать
mcount=mycount+1
tex.print('\\includegraphics{something}\\label{graphic-' .. mycount .. '}\\par')
Затем каждое изображение будет иметь \label
ассоциированный с ним файл, и при следующем запуске вы сможете выбрать его \pageref{graphic-5}
(из Lua или TeX), который сообщит вам, на какой странице оказалось пятое изображение.
полный пример:
\documentclass{article}
\directlua{j=0}
\newcommand\printluapage{%
\directlua{
for i = 1, 60 do
j=j+1
tex.print('\string\\pageref{foo' .. j .. '}\string\\label{foo' .. j .. '}')
tex.print([[\par]]) end}%
}
\begin{document}
\printluapage
New command
\printluapage
New command
\printluapage
\end{document}
решение2
Это очень простое решение, которое просто считывает значение страницы счетчика LaTeX в Lua (печать предназначена для тестирования, но оператор tex.count можно использовать и в других местах).
\documentclass{article}
\newcommand\printluapage{%
\directlua{tex.print(tex.count['c@page'])}
}
\begin{document}
\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage
\end{document}
решение3
Здесь есть две сложности.
Во-первых, каждый вызов \directlua
выполняется немедленно, поэтому, если вы хотите, чтобы произошла обычная обработка TeX, вам нужно передать управление TeX (и использовать сопрограммы или что-то в этом роде). Поэтому, когда у вас есть
\directlua{for i = 1, 60 do tex.print(tex.count['c@page'])
tex.print([[\par]]) end}
}
как в вопросе, это просто помещает 60 экземпляров 42
(или каков номер страницы) и \par
во входной стек TeX, чтобы TeX мог прочитать их после того, как весь \directlua
вызов будет завершен. (Это не приводит к обработке TeX каждого\par
и оставшийся набор текста немедленно, даже до завершения цикла.) Ваша точная проблема обсуждается с решениями в этом вопросе:Параллельное чередование выполнения Lua и TeX в LuaTeX.
Во-вторых, TeX просто добавляет элементы в свои вертикальные списки до тех пор, пока разрыв страницы не станет неизбежным (например, нет возможности разместить все собранные материалы на одной странице), поэтому значение счетчика страниц во время добавления материала не обязательно соответствует странице, на которой он окажется (например, он может оказаться на следующей странице). Номер страницы окончательно определяется только при отправке коробок. Есть некоторые трюки, чтобы справиться с этим фактом (например, запустить код Lua во время отправки?), но я этих трюков не знаю; может быть, кто-то другой ответит. :-)
Вы можете получить некоторые приблизительные результаты, используя величины, например \pagetotal
(или из Lua, tex.pagetotal
), которые показывают, сколько материала было добавлено на текущую страницу. Это требует оговорок: первый пункт выше о том, чтобы позволить TeX делать свое дело (разделить ваш код Lua между различными вызовами \directlua
), а также вам может потребоваться иметь дело с усаживающимся и растягивающимся клеем и учитывать их.
решение4
Проблема чередования заключается в следующем:частичнорешено в ConTeXt. Вы можете получить доступ к номеру страницы из Lua, и он обновляется в какой-то момент, но проблема, описанная Дэвидом вего комментарийсохраняется.
\starttext
\startluacode
for i = 1, 60 do
context(context.currentpage)
context.par()
end
\stopluacode
\stoptext