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