Игнорировать # (хэштег) внутри \newcommand

Игнорировать # (хэштег) внутри \newcommand

Я использую 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

Связанный контент