
Я набираю несколько музыкальных упражнений с помощью lilypond в TeX. Простой код, кажется, работает нормально, но у меня много кода, который используется повторно, поэтому я попытался настроить переменные. Переменные, кажется, подхватываются, но не расширяются.
МВЭ:
% !TEX encoding = UTF-8 Unicode
% !TEX TS-program = LilyPond-Book
% !LILYPOND tex = xelatex
\documentclass{memoir}
\begin{document}
\begin{lilypond}
{
\include "lilypond-variables.ly"
\time 2/4
\grace { g''32 } g'4 \Ggrace a'4 \Ggrace b'4 \Ggrace c''4
\Ggrace d''4 \Ggrace e''4 \Ggrace f''4 g''4
a''2 g''4 f''4 \Ggrace e''4
\Ggrace d''4 \Ggrace c''4 \Ggrace b'4 \Ggrace a'4
\Ggrace g'4
\bar "||"
}
\end{lilypond}
\end{document}
Включенный файл lilypond-variables.ly
:
Ggrace = { \grace { g''32 } }
Выход:
Как видите, «жестко запрограммированная» нота g в порядке, но те, которые должны быть созданы, \Ggrace
просто не отображаются.
Я пробовал \include
(с кавычками, как указано в документации Lilypond) и \input
(кавычки, как указано выше, и фигурные скобки), а до этого я пробовал стандартные \newcommand
s в коде TeX, но результат был тот же.
Поскольку у меня много-много комбинаций форшлагов, это довольно большая проблема. Я изначально жестко закодировал их все и подумал, что сделаю будущее кодирование менее болезненным и подверженным ошибкам.
Используется macOS Sierra 10.12.5 (16F73) и TL 2016.
решение1
Оказывается, если \include
вынести за пределы фигурных скобок, код будет работать нормально, как показано ниже:
% !TEX encoding = UTF-8 Unicode
% !TEX TS-program = LilyPond-Book
% !LILYPOND tex = xelatex
\documentclass{memoir}
\begin{document}
\begin{lilypond}
\include "lilypond-variables.ly"
{
\time 2/4
\grace { g''32 } g'4 \Ggrace a'4 \Ggrace b'4 \Ggrace c''4
\Ggrace d''4 \Ggrace e''4 \Ggrace f''4 g''4
a''2 g''4 f''4 \Ggrace e''4
\Ggrace d''4 \Ggrace c''4 \Ggrace b'4 \Ggrace a'4
\Ggrace g'4
\bar "||"
}
\end{lilypond}
\end{document}
Выход:
Так что на самом деле это была проблема Lilypond, как предположил @egreg (с благодарностью и коллеге из списка рассылки Lilypond, который указал на решение).