Renewcommand \textspanish

Renewcommand \textspanish

假设我编写了一个通常使用 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}

相关内容