命令中的活动字符

命令中的活动字符

我试图tipa通过创建自定义命令来简化语音排版myipa,该命令应该用相应的tipa代码替换一些常用字符。下面是一个简化得多的示例,它将所有as 替换为@s(这是tipaschwa 的代码):

\documentclass{article}
\usepackage{tipa}

\newcommand*\mytransform[1]{
  \begingroup%
      \catcode`\a=\active%
      \def a{@}%
      #1%
  \endgroup%
}

\newcommand*\myipa[1]{\textipa{\mytransform{#1}}}

\begin{document}

\myipa{blabla}

\end{document}

然而,我得到的只是Missing control sequence inserted \myipa{blabla}。这是我第一次尝试使用主动角色,因此很有可能我完全误解了一些重要的中心思想,所以请随时告诉我。

答案1

a不建议在该应用程序中使用活动字符:您将失去在 的参数内拥有名称中带有 的任何控制序列的可能性\myipa

你怎么能这样做呢?以下是必需的。

\documentclass{article}
\usepackage{tipa}

\newcommand\myipa{%
  \begingroup\catcode`\a=\active
  \begingroup\lccode`~=`a
  \lowercase{\endgroup\def~}{@}%
  \innermyipa
}
\newcommand*{\innermyipa}[1]{\textipa{#1}\endgroup}

\begin{document}

\myipa{blabla}

\end{document}

a必须间接地定义作为活动角色;还有其他方法,但这种方法很好,因为它a仅在本地设置活动的含义。最重要的是不要在激活角色之前吸收参数。

缺点是\myipa不能在另一个命令的参数中使用,因此\section{Here is \myipa{blabla}}会很严重。

另一种方法是进行字符串替换。您可以使用xstring包或expl3与一起使用xparse

\documentclass{article}
\usepackage{tipa}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\myipa}{sm}
 {
  \IfBooleanTF{#1}
   { \textipa{ #2 } }
   { \gaussler_myipa:n { #2 } }
 }

\tl_new:N \l__gaussler_input_tl

\cs_new_protected:Npn \gaussler_myipa:n #1
 {
  \tl_set:Nn \l__gaussler_input_tl { #1 }
  % change each `a' into `@'
  \tl_replace_all:Nnn \l__gaussler_input_tl { a } { @ }
  \textipa{ \l__gaussler_input_tl }
 }
\ExplSyntaxOff

\begin{document}

\section{Here is \myipa{blabla}}

\myipa{blabla}

\myipa*{blabla}
\end{document}

该命令可以在参数中使用;我还添加了一个不进行任何替换的 *-variant。

在此处输入图片描述

相关内容