在下面的MWE中我有一个需要lualatex
编译的环境。
简而言之,我正在尝试创建一个环境,该环境会创建另一个环境的非常具体的实例,即使用一堆默认代码模板。
\documentclass{article}
\usepackage{xparse} % can exclude expl3, xparse loads it
\usepackage{xpatch} % can exclude etoolbox, xpatch loads it
\usepackage{luatexbase}
\usepackage[program=lilypond]{lyluatex}
\DeclareDocumentCommand{\tune}{}
{%
\begin{lilypond}
% templated code will go here
}
\def\endtune
{%
% templated code will go here
\end{lilypond}
}
% this structure doesn't work either when identical code is inserted
%\NewDocumentEnvironment{tune}{}
%{%
%}
%{%
%}
\begin{document}
\begin{tune}
c'4 d' e' f' g' a' b' c''
\end{tune}
\end{document}
我知道没有多少人会安装 lyluatex 或 lilypond,并且我知道这个问题不会在每种嵌套环境中重现(即,用 itemize 或 figure 等替换 lilypond,这样就可以正常工作),但我认为我遇到了一个扩展问题,这个特定的环境对此很敏感。
当我运行上述 MWE 时出现以下错误:
%\begin{lilypond} on input line 28 ended by \end{tune}. \end{tune}
%\begin{tune} on input line 28 ended by \end{document}. \end{document}
这告诉我,它\end{tune}
并没有及时扩展以证明它\end{lilypond}
确实存在。
如果我是对的,我的问题是:
我能以某种方式强制这种扩展吗?
如果完整环境在宏/命令内,这个简单示例将成功编译,我认为这证实了结尾部分存在扩展问题。注意:我说这个简单示例是成功的,因为我看到过警告问题,在 latex 宏中嵌套方括号的 lilypond 命令有困难。我还没有探索过这一点,因为我还没有一个可用的模块化环境来探索。
我也怀疑额外的脚本执行层可能是问题的一部分,但我对 lua 还很陌生,刚刚开始阅读一些入门级材料。
编辑
由于 lilypond 代码的复杂性似乎会影响方法,这里有一个示例 lilypond 块,可以使用 lyluatex 在 latex 中成功编译。
\documentclass{article}
\usepackage{xparse} % can exclude expl3, xparse loads it
\usepackage{xpatch} % can exclude etoolbox, xpatch loads it
\usepackage{luatexbase}
\usepackage[program=lilypond]{lyluatex}
\begin{document}
\noindent
\begin{lilypond}
\version "2.16"
\language "français"
\header {
tagline = ""
composer = ""
}
MetriqueArmure = {
\tempo 4=70
\time 3/4
\key do \major
}
italique = { \override Score . LyricText #'font-shape = #'italic }
roman = { \override Score . LyricText #'font-shape = #'roman }
MusiqueTheme = \relative do' {
\partial 4 do4
fa4 fa la
fa4 fa la
sol4 sol la8[( sol])
fa2 do4
fa4 fa la
fa4 fa la
sol4 sol la8[( sol])
fa2 \breathe fa4^"Refrain"
sib2 sib4
la2 la4
sol4 sol sol
do2 la4
sib2 sib4
la2 la4
sol4 sol la8[( sol])
fa2. \bar "|."
}
Paroles = \lyricmode {
L'heure e -- tait ve -- nu -- e,
ou l'ai -- rain sa -- cre,
de sa voix con -- nu -- e,
an -- non -- cait l'A -- ve.
\italique
A -- ve, a -- ve, a -- ve Ma -- ri -- a_!
A -- ve, a -- ve, a -- ve Ma -- ri -- a_!
}
\score{
<<
\new Staff <<
\set Staff.midiInstrument = "flute"
\set Staff.autoBeaming = ##f
\new Voice = "theme" {
\override Score.PaperColumn #'keep-inside-line = ##t
\MetriqueArmure
\MusiqueTheme
}
>>
\new Lyrics \lyricsto theme {
\Paroles
}
>>
\layout{}
\midi{}
}
\end{lilypond}
\end{document}
答案1
环境lilypond
使用 LuaTeX 回调来获取其内容。\lilypond
命令内部有一个开关,可让其充当环境或者作为命令,具体取决于调用方式。这会让您陷入困境。相反,您可以简单地使用低级命令\ly
并在后台使用\endly
。\lilypond
\documentclass{article}
\pagestyle{empty}
\usepackage{xparse} % can exclude expl3, xparse loads it
\usepackage{xpatch} % can exclude etoolbox, xpatch loads it
\usepackage{luatexbase}
\usepackage[program=lilypond]{lyluatex}
\NewDocumentEnvironment{tune}{}{\ly}{\endly}
\begin{document}
\begin{tune}
c'4 d' e' f' g' a' b' c''
\end{tune}
\end{document}