忽略 \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

相关内容