我不知道为什么,但我可以使用 pdfLaTex 和 Texworks 编译一个简单的 Tufte 风格的标题页,但同一个文件在 Texshop 下的 XeLaTex 中却无法运行。
错误在哪里?
首先,这个MWE编译:
\documentclass{tufte-book}
\usepackage{lipsum}
\usepackage{geometry}
\geometry{paperheight=9in,paperwidth=6in}
\title{This is a Title}
\author{Me}
\date{Fall 2014}
\newenvironment{loggentry}[2]% date, heading
{\noindent\textbf{#2}\marginnote{#1}\\}{\vspace{0.5cm}}
\begin{document}
\maketitle
\begin{loggentry}{2009-Oct-31}{Snow}
\lipsum[1]
\end{loggentry}
\end{document}
本 MWE 不会:
%!TEX TS-program = xelatex
%!TEX encoding = UTF-8 Unicode
\documentclass{tufte-book}
\usepackage{geometry}
\geometry{paperheight=9in,paperwidth=6in,right=4.cm,bottom=3.cm}
\title{this is a title}
\author{me}
\date{}
\newenvironment{loggentry}[2]% date, heading
{\noindent\textbf{#2}\marginnote{#1}\\}{\vspace{1.5cm}}
\begin{document}
\maketitle
\chapter*{2014}
\begin{loggentry}{2014-Dec-31}{Party}
Party
\end{loggentry}
\end{document}
我收到一条错误消息,指出“\MakeTextUppercase 的参数有一个额外的 }”。 \par 1.19 \maketitle
除了 XeLaTex 和 Texshop,我找不到其他区别。这些会造成那么大的差别吗?
答案1
这是tufte
套件中的一个错误。最小示例
\documentclass{tufte-book}
\title{this is a title}
\author{me}
\begin{document}
\maketitle
\end{document}
使用 编译时也会失败latex
,因为使用latex
和xelatex
无法使用microtype
调整字母间距,因此tufte-common.def
只能使用soul
功能。但是,\MakeTextUppercase
使用此方法会失败。
对于 XeLaTeX,可以在我的回答中找到一种解决方法XeTeX 似乎破坏了 Tufte 讲义中的标题
\documentclass{tufte-book}
\usepackage{ifxetex}
\ifxetex
\newcommand{\textls}[2][5]{%
\begingroup\addfontfeatures{LetterSpace=#1}#2\endgroup
}
\renewcommand{\allcapsspacing}[1]{\textls[15]{#1}}
\renewcommand{\smallcapsspacing}[1]{\textls[10]{#1}}
\renewcommand{\allcaps}[1]{\textls[15]{\MakeTextUppercase{#1}}}
\renewcommand{\smallcaps}[1]{\smallcapsspacing{\scshape\MakeTextLowercase{#1}}}
\renewcommand{\textsc}[1]{\smallcapsspacing{\textsmallcaps{#1}}}
\usepackage{fontspec}
\fi
\title{this is a title}
\author{me}
\begin{document}
\maketitle
\end{document}
当然,你必须定义文本字体的替代字体;选择
\ifxetex
\newcommand{\textls}[2][5]{%
\begingroup\addfontfeatures{LetterSpace=#1}#2\endgroup
}
\renewcommand{\allcapsspacing}[1]{\textls[15]{#1}}
\renewcommand{\smallcapsspacing}[1]{\textls[10]{#1}}
\renewcommand{\allcaps}[1]{\textls[15]{\MakeTextUppercase{#1}}}
\renewcommand{\smallcaps}[1]{\smallcapsspacing{\scshape\MakeTextLowercase{#1}}}
\renewcommand{\textsc}[1]{\smallcapsspacing{\textsmallcaps{#1}}}
\usepackage{fontspec}
\setmainfont{TeX Gyre Pagella}
\setsansfont{TeX Gyre Heros}[Scale=MatchUppercase]
\fi
应该会产生非常相似的输出。选择字体的方法可能因您的机器而异,这主要取决于安装;因此里程可能会有所不同。(如果建议的代码不适合您,请在评论中询问。)
答案2
MWE 1 和 MWE 2 都可以用 pdfLaTeX 编译。MWE 1 和 MWE 2 都不能用 XeLaTeX 编译。这是在命令行中 - 与编辑器无关。
以下 MWE 演示了该问题:
\documentclass{tufte-book}
\title{this is a title}
\author{me}
\begin{document}
\maketitle
\end{document}
\MakeTextUppercase
该问题显然与触发\maketitle
XeLaTeX 错误而非 pdfLaTeX 错误有关。
需要澄清\MakeTextUppercase
的是,由 提供textcase
。但是,我无法单独使用 重现该错误,因此这与 的使用textcase
有关。tufte
答案3
这个错误被描述这里建议的解决方法是在加载 fontspec 后将这些内容添加到序言中:
% Set up the spacing using fontspec features
\renewcommand\allcapsspacing[1]{{\addfontfeature{LetterSpace=15}#1}}
\renewcommand\smallcapsspacing[1]{{\addfontfeature{LetterSpace=10}#1}}