# (Hashtag) innerhalb von \newcommand ignorieren

# (Hashtag) innerhalb von \newcommand ignorieren

Ich verwende das lyluatexPaket, 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.

\detokenizeund \stringhaben 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}

Bildbeschreibung hier eingeben

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 \lilypadetwas 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, \figdass 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

verwandte Informationen