背景与问题
我正在使用 XeLaTeX 以黑体字体排版文档,这需要使用 antiqua 字体来显示外来词和其他词。因此,我创建了两个命令来明确设置 antiqua 中的短语:\antiqua{}
,使用衬线变体,和\antisans{}
,使用无衬线变体。我在使用(子)节标题时遇到了问题\antisans{}
(这就是这个问题是关于) 并最终用我在那里发布的代码解决了这个问题。 (另请参阅 MWE) (使用\renewcommand
和类似代码编写此代码的所有尝试都失败了)
平均能量损失
\documentclass[12pt,a4paper,twoside]{scrreprt}
{numerous other packages}
\usepackage{mathspec} %loads fontspec
\setmainfont[Mapping=tex-text]{UnifrakturMaguntia} % for blackletter
\setsansfont[Mapping=tex-text]{UnifrakturCook} % for headers,
\newfontfamily\antiquafont[Mapping=tex-text]{LiberationSerif} %antiqua serif typeface
\newfontfamily\antiquasans[Mapping=tex-text]{LiberationSans} %antiqua sans-serif typeface
\newcommand\antiqua[1]{{\antiquafont #1}} %creates my antiqua-macro
\newcommand\antisans[1]{{\antiquafont #1}} %creates a similar macro for
% use in titles.
\makeatletter%
\def\antisanssubsection#1{% Defines the new subsection command
\section[#1]{% inserts a version with serifs into the short title
\def\antisans##1{{\antiquafont ##1}}#1}}% redefines \antisans{} for use within the
% actual title.
\makeatother
\begin{document}
\tableofcontents
\antisanssubsection{A Pointless Title \antisans{Lorem Ipsum} Title Containing \antisans{NMR}}
This version of the code works exactly as it should with section titles, the table
of contents, \antiqua{etc.} I am unhappy about the `wrong' perceived definition of
the \antiqua{antisans} macro, though, and wish I could get around the limitation.
\end{document}
不适用的示例和问题
上面的例子运行良好。然而,正如我所写的,我对宏的“错误”定义感到不满\antisans{}
,这应该根据其名称创建无衬线文本。我还不知道,但我可能会在标记图像等内容时将其用于章节标题之外。这就是为什么我的出发点是以下不起作用的中央编码部分:
\makeatletter%
\def\antisanssubsection#1{%
\section[{%
\def\antisans##1{{\antiquafont ##1}}#1}]%
{#1}}%
\makeatother
报道称:
Illegal parameter number in definition of \scr@ds@tocentry.
<to be read again>
1
接下来是第一行文本,其中包含\antisanssubsection
##1
我的理解是,TeX 对宏命令方括号内出现的 (twice) 感到困惑\section
。但我不明白为什么。
有没有办法对其进行编码以使其按照预期的方式工作?
重新表述这个问题:
我的代码正在重新定义(子)节(即节标题)部分中的宏{}
。如果我切换顺序以在该[]
部分(简称)中重新定义相同的宏(以不同的方式),则编译失败并出现错误。
为什么我会收到错误?我该如何重写代码以便可以在方括号内重新定义宏?
答案1
比较当前字体系列:如果是无衬线,则使用\antiquasans
,否则使用\antiquaserif
。
\documentclass[12pt,a4paper,twoside]{scrreprt}
\usepackage{pdftexcmds}
\usepackage{fontspec} %loads fontspec
\setmainfont{Old Standard} % for blackletter
\setsansfont{Futura} % for headers,
\newfontfamily\antiquaserif{LiberationSerif} %antiqua serif typeface
\newfontfamily\antiquasans{LiberationSans} %antiqua sans-serif typeface
\makeatletter
\DeclareRobustCommand{\antiqua}[1]{{%
\ifnum\pdf@strcmp{\f@family}{\sfdefault}=\z@
\antiquasans
\else
\antiquaserif
\fi
#1%
}}
\makeatother
\begin{document}
\tableofcontents
\subsection{A Pointless Title \antiqua{Lorem Ipsum} Title Containing \antiqua{NMR}}
This version of the code works exactly as it should with section titles, the table
of contents, \antiqua{etc.} I am unhappy about the `wrong' perceived definition of
the \antiqua{antisans} macro, though, and wish I could get around the limitation.
\end{document}