使用 lualatex 依赖包进行非平凡的嵌套环境扩展

使用 lualatex 依赖包进行非平凡的嵌套环境扩展

在下面的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}

在此处输入图片描述

相关内容