TL;DR 请参阅下文“核心问题”
问题
我正在尝试解决软件包之间的冲突tipa
(IPA 语音字符的字体和宏) 和babel
选项ngerman
。问题在于"
字符,两个包都使用这个字符。我已经走了很远,下面是我得到的:
仅使用tipa
\documentclass{article}
\usepackage{tipa}
\usepackage[T1]{fontenc}
\begin{document}
\textipa{" ""}
\end{document}
产生所需的
ˈ ˌ
(一次应力和二次应力)
仅使用babel
\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage[T1]{fontenc}
\begin{document}
"a "s "‘ "’ "< ">
\end{document}
产生所需的
ä ß „ “ « »
babel
(特定于的简写结果ngerman
,english
即不会产生此输出)
使用babel
和tipa
\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage{tipa}
\usepackage[T1]{fontenc}
\begin{document}
\textipa{"x""x"a"s}
\end{document}
产生不期望的
ˈxxäß
问题:次要重音被破坏,并且主要重音 ( "
) a) 在元音之前会导致元音上的分音符或颤音(=两个点,“变音符号”)以及 b) 在 之前s
会导致尖锐的 s (ß)。
我的方法
由于在 中\textipa
,"
应该被 拾取tipa
,所以我使用了babel
的\shorthandoff{"}
:
\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage{tipa}
\usepackage[T1]{fontenc}
\begin{document}
\shorthandoff{"}
\textipa{"a""s}
\end{document}
产生所需的
ˈxˌxˈaˈs
问题解决了吗?还没有。为了限制范围\shorthandoff{"}
并节省输入,我将其放在宏中\myipa
,但这不起作用:
\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage{tipa}
\usepackage[T1]{fontenc}
\newcommand{\myipa}[1]{\shorthandoff{"}\textipa{#1}}
\begin{document}
\myipa{"x""x"a"s}
\end{document}
产生不期望的
ˈxxäß
将 放入\shorthandoff{"}
的\textipa
参数中没有什么区别(\newcommand{\myipa}[1]{\textipa{\shorthandoff{"}#1}}
)。
一般来说,放入\shorthandoff{"}
宏可以起到以下作用:
\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage[T1]{fontenc}
\newcommand{\shoff}{{\shorthandoff{"} "a}}
\begin{document}
"a \shoff{} "a
\end{document}
产生所需的
ä “一个 ä
TL;DR – 核心问题
babel
's\shorthandoff{"}
似乎对超出其直接范围的输入字符没有影响:
\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage[T1]{fontenc}
\newcommand{\shoff}[1]{{\shorthandoff{"} 2"a #1}}
\begin{document}
1"a \shoff{3"a} 4"a
\end{document}
生产
1 2 3 4
即在与产生"a
相同的宏中调用\shorthandoff{"}
“A(2),但作为包含procudes"a
的宏的参数调用\shorthandoff{"}
A(3)。
tipa
我该如何修复这个宏才能成功完成获取和babel
/ngerman
或成为朋友的最后一步?
答案1
您必须推迟收集论点:
\newcommand{\myipa}{\begingroup\shorthandoff{"}\myipaI}
\newcommand{\myipaI}[1]{\tipaencoding #1\endgroup}
这将正确排版位\myipa{"x""x"a"s}
。当然,这样的命令不能放在其他命令的参数中。如果您需要将其放入章节标题中,请说
\shorthandoff{"}
\section{\textipa{"x""x"a"s}}
\shorthandon{"}
\myipa
如果您需要排版目录,这里将不起作用。总是存在相同的问题:当某些字符被收集为参数时,它们的类别代码是固定的。
然而,这表明了一种不同的方法:
\newcommand{\myipa}[1]{{\shorthandoff{"}\scantokens{\tipaencoding#1\endinput}}}
或者,如果您在移动参数中经常需要它;对于一两种情况,\DeclareRobustCommand
总是可以在前面加上\myipa
。\protect
答案2
babel
我对的选项有同样的问题spanish
。一个简单的解决方法是指示加载两种语言,并在需要 IPA 时babel
将语言设置为:english
\documentclass{minimal}
\usepackage[ngerman,english]{babel} % or [spanish,english], or whatever
\usepackage{tipa}
\newcommand{\myipa}[1]{\begin{otherlanguage}{english}\textipa{#1}\end{otherlanguage}}
\begin{document}
\selectlanguage{ngerman}
% ... stuff in German ...
\myipa{"x""x"a"s} % should be 'x,x'a's
% ... more stuff in German ...
\end{document}
这种方法还应该处理与"
角色无关的其他潜在冲突。