我正在 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
的结合有关,polyglossia
german
caption
并且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 下,应始终加载包amsmath
、amssymb
和bm
前和。 fontspec
(polyglossia
建议在任何修改数学相关宏的包之后加载也是标准做法fontspec
——当然,例如 、amsmath
和amssymb
。bm
然而,最近某个时候,对fontspec
进行了更新,不再需要此建议。)
如果由于某种原因,你必须polyglossia
先加载,那么至少将指令推迟\setmainlanguage{...}
到\setotherlanguage{...}
序言中的稍后位置,即,后 amsmath
、amssymb
和bm
均已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任何一个)。
加载amsmath
和bm
之前或之后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}
,问题将再次出现。