在 XeLaTex 中编译 Tufte 标题页时出现问题

在 XeLaTex 中编译 Tufte 标题页时出现问题

我不知道为什么,但我可以使用 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,因为使用latexxelatex无法使用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该问题显然与触发\maketitleXeLaTeX 错误而非 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}}

相关内容