使用 LuaLaTeX 和 polyglossia (使用 `\setmainlanguage{german}`) 时宏定义不起作用

使用 LuaLaTeX 和 polyglossia (使用 `\setmainlanguage{german}`) 时宏定义不起作用

我正在 Ubuntu 上更新的 TexLive 2017 安装中使用 LuaLaTeX 编译以下 MWE:

% !TeX program=lualatex
\documentclass[a4paper,12pt,twoside=semi,openright]{scrbook}

\usepackage{polyglossia}
\setmainlanguage{german}
\setotherlanguage{english}
\usepackage{fontspec}

\usepackage{subfig}

\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{bm}

\renewcommand{\vec}[1]{\bm{#1}}

\begin{document}
    \begin{align}
        \vec{x} = 1
    \end{align}
\end{document}

以下是我得到的结果:

在此处输入图片描述

期望的输出当然是X=1。

请注意,这仅在使用时才会失败\setmainlanguage{german}。使用 pdfLaTeX 和 babel 也可以正常工作。

 *File List*
 scrbook.cls    2017/09/07 v3.24 KOMA-Script document class (book)
scrkbase.sty    2017/09/07 v3.24 KOMA-Script package (KOMA-Script-dependent basi
cs and keyval usage)
 scrbase.sty    2017/09/07 v3.24 KOMA-Script package (KOMA-Script-independent ba
sics and keyval usage)
  keyval.sty    2014/10/28 v1.15 key=value parser (DPC)
scrlfile.sty    2017/09/07 v3.24 KOMA-Script package (loading files)
tocbasic.sty    2017/09/07 v3.24 KOMA-Script package (handling toc-files)
scrsize12pt.clo    2017/09/07 v3.24 KOMA-Script font size class option (12pt)
typearea.sty    2017/09/07 v3.24 KOMA-Script package (type area)
polyglossia.sty    2015/03/25 v1.42.4 Alternative to Babel for XeLaTeX and LuaLa
TeX
etoolbox.sty    2017/01/02 v2.4 e-TeX tools for LaTeX (JAW)
makecmds.sty    2009/09/03 v1.0a extra command making commands
 xkeyval.sty    2014/12/03 v2.7a package option processing (HA)
 xkeyval.tex    2014/12/03 v2.7a key=value parser (HA)
fontspec.sty    2017/11/09 v2.6g Font selection for XeLaTeX and LuaLaTeX
  xparse.sty    2017/11/14 L3 Experimental document command parser
   expl3.sty    2017/11/14 L3 programming layer (loader) 
expl3-code.tex    2017/11/14 L3 programming layer 
l3pdfmode.def    2017/03/18 v L3 Experimental driver: PDF mode
fontspec-luatex.sty    2017/11/09 v2.6g Font selection for XeLaTeX and LuaLaTeX
 fontenc.sty
   tuenc.def    2017/04/05 v2.0i Standard LaTeX file
fontspec.cfg
ifluatex.sty    2016/05/16 v1.4 Provides the ifluatex switch (HO)
 ifxetex.sty    2010/09/12 v0.6 Provides ifxetex conditional
luatexbase.sty    2015/10/04 v1.3 luatexbase interface to LuaTeX 
ctablestack.sty    2015/10/01 v1.0 Catcode table stable support
gloss-german.ldf    polyglossia: module for german
 babelsh.def    2013/04/30 Babel common definitions for shorthands
 Taken verbatim from babel.def (2013/04/15 v3.9e)
gloss-english.ldf    polyglossia: module for english
  subfig.sty    2005/06/28 ver: 1.3 subfig package
 caption.sty    2016/02/21 v3.3-144 Customizing captions (AR)
caption3.sty    2016/05/22 v1.7-166 caption3 kernel (AR)
 amsmath.sty    2017/09/02 v2.17a AMS math features
 amstext.sty    2000/06/29 v2.01 AMS text
  amsgen.sty    1999/11/30 v2.0 generic functions
  amsbsy.sty    1999/11/29 v1.2d Bold Symbols
  amsopn.sty    2016/03/08 v2.02 operator names
 amssymb.sty    2013/01/14 v3.01 AMS font symbols
amsfonts.sty    2013/01/14 v3.01 Basic AMSFonts support
      bm.sty    2017/01/16 v1.2c Bold Symbol Support (DPC/FMi)
    umsa.fd    2013/01/14 v3.01 AMS symbols A
    umsb.fd    2013/01/14 v3.01 AMS symbols B
 ***********

答案1

您可以使用\AtBeginDocument来延迟\setmainlanguage(与babel polyglossia语言相关的 catcode 更改至少会立即发生相反german,因此建议尽可能晚地进行语言选择,以避免在加载其他包或附加前导码定义时出现问题):

% !TeX program = lualatex

\documentclass[a4paper,12pt,twoside=semi,openright]{scrbook}

\usepackage{polyglossia}
\AtBeginDocument{%
  \setmainlanguage{german}%
  \setotherlanguage{english}%
}
\usepackage{fontspec}

\usepackage{subfig}

\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{bm}

\renewcommand{\vec}[1]{\bm{#1}}

\begin{document}
    \begin{align}
        \vec{x} = 1
    \end{align}
\end{document}

%%% Local Variables:
%%% mode: latex
%%% TeX-engine: luatex
%%% TeX-master: t
%%% End:

解决方法


顺便说一句:问题似乎与与主要语言lualatex的结合有关,polyglossiagermancaption并且bm。MWE 将是:

% !TeX program = lualatex
\listfiles
\documentclass{article}

\usepackage{polyglossia}
\setmainlanguage{german}
\usepackage{caption}
\usepackage{bm}

\begin{document}
$\bm{x} = 1$
\end{document}

%%% Local Variables:
%%% mode: latex
%%% TeX-engine: luatex
%%% TeX-master: t
%%% End:

如果您使用xelatex而不是lualatex或延迟\setmainlanguage{german},例如使用\AtBeginDocument,或加载bm之前的polyglossia问题不再存在。

因此你也可以使用:

% !TeX program = lualatex
\listfiles
\documentclass{article}

\usepackage{bm}
\usepackage{polyglossia}
\setmainlanguage{german}
\usepackage{caption}
\usepackage[german=quotes]{csquotes}
\begin{document}
$\bm{x} = 1$
\end{document}

%%% Local Variables:
%%% mode: latex
%%% TeX-engine: luatex
%%% TeX-master: t
%%% End:

你不应该使用\AtBeginDocument来加载包,因为未使用的全局选项在执行\AtBeginDocument钩子之前会报告。并且您不能使用\AtBeginDocument来加载包csquotes。但您可以\AtEndPreamble使用etoolbox,因为相应的钩子在一开始就执行了\begin{document}

% !TeX program = lualatex
\listfiles
\documentclass{article}

\usepackage{etoolbox}
\usepackage{bm}
\usepackage{polyglossia}
\AtEndPreamble{\setmainlanguage{german}}
\usepackage{caption}
\AtEndPreamble{\usepackage[german=quotes]{csquotes}}
\begin{document}
$\bm{x} = 1$
\end{document}

%%% Local Variables:
%%% mode: latex
%%% TeX-engine: luatex
%%% TeX-master: t
%%% End:

最后但同样重要的一点是,您可以使用babel而不是polyglossia将德语作为主要语言,英语作为第二语言lualatex

% !TeX program = lualatex
\listfiles
\documentclass{article}

\usepackage[main=ngerman,english]{babel}
\usepackage{bm}
\usepackage{caption}
\usepackage[german=quotes]{csquotes}
\begin{document}
$\bm{x} = 1$
\end{document}

%%% Local Variables:
%%% mode: latex
%%% TeX-engine: luatex
%%% TeX-master: t
%%% End:

答案2

在 LuaLaTeX 下,应始终加载包amsmathamssymbbm和。 fontspecpolyglossia建议在任何修改数学相关宏的包之后加载也是标准做法fontspec——当然,例如 、amsmathamssymbbm然而,最近某个时候,对fontspec进行了更新,不再需要此建议。)

如果由于某种原因,你必须polyglossia先加载,那么至少将指令推迟\setmainlanguage{...}\setotherlanguage{...}序言中的稍后位置,即, amsmathamssymbbm均已fontspec加载。

请注意,我故意以“在 LuaLaTeX 下,...”开头回答:恐怕我没有在 XeLaTeX 下使用包加载顺序的经验。

以下修改后的 MWE 版本可以编译:

% !TeX program=lualatex
\documentclass[a4paper,12pt,twoside=semi,openright]{scrbook}

\usepackage{amsmath,amssymb,bm}
\usepackage{fontspec}

\usepackage{polyglossia} % load it *after* amsmath, amssymb, bm, and fontspec
\setmainlanguage{german}
\setotherlanguage{english}

\usepackage{subfig} % it doesn't seem to matter when this package is loaded

\renewcommand{\vec}[1]{\bm{#1}}

\begin{document}
\[ \vec{x} = 1 \]
\end{document}

答案3

问题是,\setmainlanguage{german}设置"为简写字符并bm在该声明之后加载会完全破坏使用 LuaLaTeX 时包所做的定义。

你得到的奇怪字符串本质上是随机的。如果不加载,subfig你什么也得不到(但没有X任何一个)。

加载amsmathbm之前或之后polyglossia无关紧要,只要进行语言声明即可包裹加载。

\documentclass{article}

\usepackage{polyglossia}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{bm}

\usepackage{subfig}

\setmainlanguage{german}

\renewcommand{\vec}[1]{\bm{#1}}

\begin{document}

$\vec{x}$

\end{document}

\usepackage{bm}稍后再尝试移动\setmainlanguage{german},问题将再次出现。

相关内容