Ignore # (hashtag) em \newcommand

Ignore # (hashtag) em \newcommand

Estou usando o lyluatexpacote para integrar LilyPond ao LaTeX. Eu criei o seguinte comando para gerar convenientemente o Figured Bass no tamanho correto em um texto:

\newcommand{\fig}[1]{%
    \raisebox{-2pt}{%
        \lilypond{%
        #(set-global-staff-size 18)%
        \figures {#1}
        }%
    }%
}

O problema é que #(set-global-staff-size 18)não é realmente um argumento, mas sim um comando LilyPond. O código é compilado, mas sempre tenho que dizer para ele pular o argumento inválido.

\detokenizee \stringse mostraram ineficazes.

Alguma sugestão sobre como passar a hashtag para LilyPond enquanto o LaTeX a ignora?

Responder1

Se #for o catcode 12 entrando \lilypad, então isto:

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

insira a descrição da imagem aqui

Se #for o catcode 6, então isto:

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

Obviamente, nesses exemplos, eu redefini \lilypadpara algo detalhado, então não precisei executar um exemplo musical real.

Responder2

Você pode usar \edef, o que requer tornar alguns nomes de sequência de controle não expansíveis; uma interface de nível inferior é necessária para garantir \figum novo comando.

\makeatletter
\@ifdefinable{\fig}{%
  \edef\fig#1{%
    \noexpand\raisebox{-2pt}{%
      \noexpand\lilypond{%
        \string#(set-global-staff-size 18)%
        \noexpand\figures {#1}%
      }%
    }%
  }%
}
\makeatother

informação relacionada