TL;DR – 核心问题

TL;DR – 核心问题

TL;DR 请参阅下文“核心问题”


问题

我正在尝试解决软件包之间的冲突tipaIPA 语音字符的字体和宏) 和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(特定于的简写结果ngermanenglish即不会产生此输出)

使用babeltipa

\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}

这种方法还应该处理与"角色无关的其他潜在冲突。

相关内容