切换章节标题中的字体,同时保持目录与标题本身的衬线/无衬线区别

切换章节标题中的字体,同时保持目录与标题本身的衬线/无衬线区别

这个问题的解决方案可能非常简单,但我太愚蠢了,看不到它......

考虑一份用黑体书写的文档。德语黑体排版规则要求拉丁词和大写缩写必须使用古体。我遵循了 fontspec 包的建议,创建了一个新的字体系列和一个小\antiqua宏。这在文本段落中非常有效,因为我知道我想要的是衬线字体还是无衬线字体。但是,我无法创建某种东西,在章节标题本身中将古体部分渲染为无衬线字体,同时在目录中将相同内容转换为相应的衬线字体……有什么简单的解决方案吗?

\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]{{\antiquasans #1}} %creates a similar macro for sans-serif antiqua typing

\begin{document}
\tableofcontents
\chapter{My Blackletter Text about \antisans{NMR}}
So any appearance of the abbreviation \antiqua{NMR,} other abbreviations,
other paragraph text \antiqua{etc.} can be set perfectly here, but
the \antiqua{NMR}-part in the table of contents will be sans-serif, which
it mustn't.
\end{document}

说实话,我本来不会指望这段代码能毫无瑕疵地运行,因为衬线和无衬线部分之间没有任何联系(除了名称以同一个单词开头这一事实)。当然,这个最小示例可以与任何其他两种字体的组合一起使用,只要它们足够不同,可以将它们区分开来。

答案1

定义一个\antiqua命令,检查当前字体系列是否为无衬线字体。

该示例的字体选择相当奇特,只是为了更好地展示效果。因此,Termes 用于普通文本,Adventor 用于标准无衬线字体,Chorus 是 Antiqua Sans 的替代品,Cursor 是 Antiqua Serif 的替代品。它是不是旨在成为优秀排版的典范。;-)

\documentclass[12pt,a4paper,twoside]{scrreprt}

\usepackage{pdftexcmds}

\usepackage{fontspec}
\setmainfont{TeX Gyre Termes}
\setsansfont{TeX Gyre Adventor}
\newfontfamily\antiquaserif{TeX Gyre Cursor}
\newfontfamily\antiquasans{TeX Gyre Chorus}


\makeatletter
\DeclareRobustCommand{\antiqua}[1]{{%
   \ifnum\pdf@strcmp{\f@family}{\sfdefault}=\z@
     \antiquasans
   \else
     \antiquaserif
   \fi
   #1%
}}
\makeatother

\begin{document}
\tableofcontents

\chapter{My Blackletter Text about \antiqua{NMR}}

So any appearance of the abbreviation \antiqua{NMR,} other abbreviations,
other paragraph text \antiqua{etc.} can be set perfectly here; also
the \antiqua{NMR}-part in the table of contents will be sans serif.

\end{document}

在此处输入图片描述

答案2

我认为你需要做的是增强教学

\chapter{My Blackletter Text about \antisans{NMR}}

\chapter[My Blackletter Text about \antiqua{NMR}]{My 
   Blackletter Text about \antisans{NMR}}

即,您需要提供一个可选参数,告诉(Xe)LaTeX 如何在目录中排版章节标题。

附录从一些后续评论中,我认为您希望完全自动化此过程,即您宁愿不必编写各种分段命令的可选参数。我不清楚如何做到这一点,但我怀疑这需要对分段命令进行一些认真的重新编码。

答案3

一种可能的解决方案是定义一个开关,定义命令是出现在主文本中还是出现在节标题内,并由节标题自动调用

\documentclass[12pt,a4paper,twoside]{scrreprt}

\usepackage{etoolbox}

\usepackage{mathspec} %loads fontspec
\setmainfont[Mapping=tex-text]{Times} % for blackletter
\setsansfont[Mapping=tex-text]{Arial} % for headers,
\newfontfamily\antiquafont[Mapping=tex-text]{Optima} %antiqua serif typeface
\newfontfamily\antiquasans[Mapping=tex-text]{Courier} %antiqua sans-serif typeface
\newcommand\antiqua[1]{{\antiquafont #1}} %creates my antiqua-macro
\newcommand\antisans[1]{{\iftoggle{insection}{\antiquasans #1}{\antiquafont #1}}} %creates a similar macro for sans-serif antiqua typing

\newtoggle{insection}

\makeatletter    
\renewcommand\chapter{\if@openright\cleardoublepage\else\clearpage\fi
  \thispagestyle{\chapterpagestyle}%
  \global\@topnum\z@
  \@afterindentfalse
  \toggletrue{insection}
  \secdef\@chapter\@schapter
}
\renewcommand\section{\@startsection{section}{1}{\z@}%
  {-3.5ex \@plus -1ex \@minus -.2ex}%
  {2.3ex \@plus.2ex}%
  {\toggletrue{insection}\ifnum \scr@compatibility>\@nameuse{scr@[email protected]}\relax
    \setlength{\parfillskip}{\z@ plus 1fil}\fi
    \raggedsection\normalfont\sectfont\nobreak\size@section}%
}
\renewcommand\subsection{\@startsection{subsection}{2}{\z@}%
  {-3.25ex\@plus -1ex \@minus -.2ex}%
  {1.5ex \@plus .2ex}%
  {\toggletrue{insection}\ifnum \scr@compatibility>\@nameuse{scr@[email protected]}\relax
    \setlength{\parfillskip}{\z@ plus 1fil}\fi
    \raggedsection\normalfont\sectfont\nobreak\size@subsection
  }%
}
\makeatother


\begin{document}
\tableofcontents
\chapter{My Blackletter Text about \antisans{NMR}}
So any appearance of the abbreviation \antiqua{NMR,} \textsf{NMR} other
abbreviations,other paragraph text \antiqua{etc.} can be set perfectly here,
but the \antiqua{NMR}-part in the table of contents will be sans-serif, which
it mustn't.

\chapter{Test \antisans{Test}}
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

\end{document}

警告:必须重新定义所有部分命令(例如,部分,部分,小节...)并在正确的位置插入开关。

答案4

差不多三年后,在一份新文档(感兴趣的人可以将其称为博士论文,而不是硕士论文)中再次遇到同样的问题,而且我有更多的时间,于是我想出了一个更好的破解方法。我创建了一个新命令,\antisanssubsection其定义如下:

\makeatletter
\def\antisans#1{{\antiquafont #1}}
\def\antisanssubsection#1{%
\section[#1]{%
\def\antisans##1{{\antiquasans ##1}}#1}}%
\makeatother

这包括重新定义,\antisans{}就好像它是一样\antiqua{}

键入:

\antisanssection{This is my Blackletter and \antisans{Antiqua} Section Title
Containing a Pointless \antisans{Lorem Ipsum}}

现在将编译为:

\section[This is my Blackletter and {\antiquafont Antiqua} Section Title
Containing a Pointless {\antiquafont Lorem Ipsum}]{This is my Blackletter
and {\antiquafont Antiqua} Section Title Containing a Pointless {\antiquafont
Lorem Ipsum}}

(为了清晰起见,添加了换行符,但原文中没有)。

由于某种原因,我没能编写相反的代码(\antisans{}定义了它的方式,并在\section[ ]内容中切换了它的定义,但这是后续问题

相关内容