如何使 tipa 与 brackett 兼容?

如何使 tipa 与 brackett 兼容?

如果删除百分号,以下最小工作示例将会产生错误。

\documentclass{amsart}
%\usepackage{tipa}
\usepackage{braket}
\begin{document}
\[
\Set{x|y}
\]
\end{document}

错误信息:

LaTeX Warning: Command \: invalid in math mode on input line 6.
LaTeX Warning: Command \: invalid in math mode on input line 6.
LaTeX Warning: Command \; invalid in math mode on input line 6.
LaTeX Warning: Command \; invalid in math mode on input line 6.
! Missing } inserted.
<inserted text> 
                }
l.6 \Set{x|y}

答案1

tipa包重新定义了一些标准命令,这是导致您收到错误的原因,但提供了一个“兼容性”层。值得注意的是,它重新定义的命令是

  • \s(别名\textsyllabic
  • \*(未提供别名)
  • \|(未提供别名)
  • \:(别名\tipamedspace
  • \;(别名\tipathickspace
  • \!(别名\tipanegthinspace

如果你使用选项来调用该包safe,即

\usepackage[safe]{tipa}

不执行重新定义。手册第 3.1.3 节tipa

答案2

请注意braket.sty其中有:

{\catcode`\|=\active
  \xdef\set{\protect\expandafter\noexpand\csname set \endcsname}
  \expandafter\gdef\csname set \endcsname#1{\mathinner
        {\lbrace\,{\mathcode`\|32768\let|\midvert #1}\,\rbrace}}
  \xdef\Set{\protect\expandafter\noexpand\csname Set \endcsname}
  \expandafter\gdef\csname Set \endcsname#1{\left\{%
     \ifx\SavedDoubleVert\relax \let\SavedDoubleVert\|\fi
     \:{\let\|\SetDoubleVert
     \mathcode`\|32768\let|\SetVert
     #1}\:\right\}}
}
\def\midvert{\egroup\mid\bgroup}
\def\SetVert{\@ifnextchar|{\|\@gobble}% turn || into \|
    {\egroup\;\mid@vertical\;\bgroup}}
\def\SetDoubleVert{\egroup\;\mid@dblvertical\;\bgroup}

代码具体做什么并不重要,但要注意代码中使用了\:和。如果重新定义这些命令,当然会有问题。\;tipa

一种方法是在中重新定义这些宏braket.sty

%! TEX program = pdflatex
\documentclass{amsart}
\usepackage{tipa}
\usepackage{braket}


\makeatletter
{\catcode`\|=\active
  \xdef\set{\protect\expandafter\noexpand\csname set \endcsname}
  \expandafter\gdef\csname set \endcsname#1{\mathinner
        {\lbrace\,{\mathcode`\|32768\let|\midvert #1}\,\rbrace}}
  \xdef\Set{\protect\expandafter\noexpand\csname Set \endcsname}
  \expandafter\gdef\csname Set \endcsname#1{\left\{%
     \ifx\SavedDoubleVert\relax \let\SavedDoubleVert\|\fi
     \medspace{\let\|\SetDoubleVert
     \mathcode`\|32768\let|\SetVert
     #1}\medspace\right\}}
}
\def\midvert{\egroup\mid\bgroup}
\def\SetVert{\@ifnextchar|{\|\@gobble}% turn || into \|
    {\egroup\thickspace\mid@vertical\thickspace\bgroup}}
\def\SetDoubleVert{\egroup\thickspace\mid@dblvertical\thickspace\bgroup}
\makeatother

\begin{document}
\[
\Set{x|y}
\]
\end{document}

\tipasafemode另一种方法是每次需要时使用\Set,如tipa文档中所建议的那样(这显然很笨重)。

%! TEX program = pdflatex
\documentclass{amsart}
\usepackage{tipa}
\usepackage{braket}
\begin{document}
{\tipasafemode
\[
\Set{x|y}
\]
}
\end{document}

相关内容