假设我编写了一个通常使用 xelatex(和 polyglossia)编译的 LaTeX 文档,但我想使用 pdflatex(和 babel)作为后备(当我将其发送给可能未安装 xelatex 的人时)。为此,我会\textspanish{}
在文档中写入并提出以下重新定义(基本上包含在 中if pdflatex
):
\newcommand{\textspanish}[2][]{\foreignlanguage{spanish}{#2}}
这种方法似乎适用于大多数语言,但出于某种原因,babel 已经\textspanish
定义了一个命令。所以我尝试了同样的方法,但由于我不明白的原因,\renewcommand
这陷入了无限递归或类似的东西( )。TeX capacity exceeded, sorry [grouping levels=255]
示例文档(与 xelatex 一起使用,但与 pdflatex 一起使用时失败):
\documentclass[english,]{article}
\usepackage{lmodern}
\usepackage{ifxetex,ifluatex}
\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex
\usepackage[shorthands=off,spanish,english]{babel}
\newcommand{\textspanish}[2][]{\foreignlanguage{spanish}{#2}}
\else
\usepackage{polyglossia}
\setmainlanguage[]{english}
\setotherlanguage[]{spanish}
\fi
\begin{document}
Hello \textspanish{Hola}
\end{document}
答案1
这是一个不需要其他包的解决方案:
\documentclass[english]{article}
\usepackage{lmodern}
\usepackage{ifxetex,ifluatex}
\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex\
\usepackage[shorthands=off,spanish,main=english]{babel}
\let\oritextspanish\textspanish
\AddBabelHook{spanish}{beforeextras}
{\renewcommand{\textspanish}{\oritextspanish}}
\AddBabelHook{spanish}{afterextras}
{\renewcommand{\textspanish}[2][]{\foreignlanguage{spanish}{##2}}}
\else
\usepackage{polyglossia}
\setmainlanguage[]{english}
\setotherlanguage[]{spanish}
\fi
\begin{document}
Hello \textspanish{Hola n\sptext{os}}
\end{document}
与主要语言相关的问题也得到了修复(我想知道这是否[2][]
是故意的,因为可选参数根本没有使用)。
答案2
我不确定你说的“后备”是什么意思。问题似乎是,只要你启用西班牙语,命令就已经存在了;好消息是,这个命令本质上确实polyglossia
如此。\textspanish
\foreignlanguage{spanish}
坏消息是,它babel-spanish
定义了\textspanish
(我不知道他们为什么选择这个名字),并且基本上不希望您能按您喜欢的方式使用它。
\textspanish
下面是如何在 中使用的例子spanish.ldf
,它也暗示了它的作用,即它进行一些设置:
203 \def\extrasspanish{%
204 \textspanish
205 \mathspanish
206 \ifx\shorthandsspanish\@empty
207 \expandafter\spanishdeactivate\expandafter{\es@shlist}%
208 \languageshorthands{none}%
209 \else
210 \shorthandsspanish
211 \fi}
的定义\textspanish
是逐步进行的,因此不容易获得。我的观点是,这应该是一个内部命令(因此使用不同的名称),因为它在用户级别上没有真正有用的功能(顺便说一句,它没有记录在案)。但是,更改spanish.ldf
宏以使用不同的名称会非常复杂(并且无法在文档之间移植,除非同时复制补丁)。
相反,polyglossia
使用一致的界面:对于每种<language>
加载的语言,都有\text<language>
一个缩写,\foreignlanguage{<language>}
加上一些调整,以便在从右到左的语言环境中也能做正确的事情。
答案3
主要问题是\textspanish
用于语言切换命令。因此您可以尝试这样的操作:
\documentclass[english,]{article}
\usepackage{lmodern}
\usepackage{ifxetex,ifluatex,xpatch}
\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex\
\usepackage[shorthands=off,spanish,english]{babel}
\let\oritextspanish\textspanish
\patchcmd\extrasspanish{\textspanish}{\oritextspanish}{}{}
\patchcmd\noextrasspanish{\textspanish}{\oritextspanish}{}{}
\renewcommand{\textspanish}[2][]{\foreignlanguage{spanish}{#2}}
\else
\usepackage{polyglossia}
\setmainlanguage[]{english}
\setotherlanguage[]{spanish}
\fi
\begin{document}
Hello \textspanish{Hola}
\end{document}