背景与问题

背景与问题

背景与问题

我正在使用 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}

在此处输入图片描述

相关内容