我正在使用该lyluatex
包将 LilyPond 集成到 LaTeX。我创建了以下命令,以便在文本中方便地输出正确大小的 Figured Bass:
\newcommand{\fig}[1]{%
\raisebox{-2pt}{%
\lilypond{%
#(set-global-staff-size 18)%
\figures {#1}
}%
}%
}
问题在于,这#(set-global-staff-size 18)
实际上不是一个参数,而是一个 LilyPond 命令。代码确实可以编译,但我每次都必须告诉它跳过无效参数。
\detokenize
并被\string
证明是无效的。
关于如何将标签传递给 LilyPond 同时让 LaTeX 忽略它,有什么建议吗?
答案1
如果#
可以将 catcode 12 放入\lilypad
,那么这样:
\documentclass{article}
\begin{document}
\newcommand{\fig}[1]{%
\raisebox{-2pt}{%
\prelilypond{%
##(set-global-staff-size 18)%
figures {#1}% I removed the backslash for this non-working example.
}%
}%
}
\newcommand\prelilypond[1]{\expandafter\lilypond\expandafter{\string#1}}
\def\lilypond#1{#1}
\fig{1}
\end{document}
如果#
必须是 catcode 6,那么这样:
\documentclass{article}
\begin{document}
\newcommand{\fig}[1]{%
\raisebox{-2pt}{%
\lilypond{%
##(set-global-staff-size 18)%
figures {#1}% I removed the backslash for this non-working example.
}%
}%
}
\def\lilypond#1{\string#1}
\fig{1}
\end{document}
显然,在这些例子中,我重新定义了\lilypad
一些冗长的内容,因此我不必执行实际的音乐示例。
答案2
您可以使用\edef
,这需要使一些控制序列名称不可扩展;需要一个较低级别的接口来确保\fig
是一个新命令。
\makeatletter
\@ifdefinable{\fig}{%
\edef\fig#1{%
\noexpand\raisebox{-2pt}{%
\noexpand\lilypond{%
\string#(set-global-staff-size 18)%
\noexpand\figures {#1}%
}%
}%
}%
}
\makeatother