Ich verwende das lyluatex
Paket, um LilyPond in LaTeX zu integrieren. Ich habe den folgenden Befehl erstellt, um bequem Generalbass in der richtigen Größe innerhalb eines Textes auszugeben:
\newcommand{\fig}[1]{%
\raisebox{-2pt}{%
\lilypond{%
#(set-global-staff-size 18)%
\figures {#1}
}%
}%
}
Das Problem ist, #(set-global-staff-size 18)
dass es sich nicht wirklich um ein Argument handelt, sondern um einen LilyPond-Befehl. Der Code wird zwar kompiliert, aber ich muss ihm sagen, dass er das ungültige Argument jedes Mal überspringen soll.
\detokenize
und \string
haben sich als unwirksam erwiesen.
Irgendwelche Vorschläge, wie man das Hashtag an LilyPond weitergibt, während LaTeX es ignoriert?
Antwort1
Wenn der #
Catcode 12 eingegeben werden kann \lilypad
, dann dies:
\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}
Wenn es #
Catcode 6 sein muss, dann dies:
\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}
Offensichtlich habe ich in diesen Beispielen \lilypad
etwas ausführlichere Neudefinitionen vorgenommen, sodass ich kein tatsächliches Musikbeispiel vorführen musste.
Antwort2
Sie können verwenden \edef
, was erfordert, dass einige Steuersequenznamen nicht erweiterbar sind; eine Schnittstelle auf niedrigerer Ebene ist erforderlich, um sicherzustellen, \fig
dass es sich um einen neuen Befehl handelt.
\makeatletter
\@ifdefinable{\fig}{%
\edef\fig#1{%
\noexpand\raisebox{-2pt}{%
\noexpand\lilypond{%
\string#(set-global-staff-size 18)%
\noexpand\figures {#1}%
}%
}%
}%
}
\makeatother