我希望将部分 toc 条目格式化\bfseries\sffamily
为小型大写字母。此组合不适用于所用的字体。甚至使用软件包也不行。我通过将相应首字母的字体大小增加一级然后再减小来“手动”实现了它。我知道这是一种“糟糕的黑客行为”,不推荐。但在这种情况下它看起来确实相当不错。由于我需要它几次,并且想定义类似的东西,而不仅仅是“硬编码”,我想知道是否有可能编写一个解析器,将“Paris and Rome”这样的字符串解析为\large P\normalsize ARIS AND \large R\normalsize OME
...?
这或多或少就是我现在所用的:
\documentclass[headings=optiontotoc,paper=a5,10pt]{scrbook}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xcolor}
\usepackage{microtype}
\usepackage{hyperref}
\usepackage{bookmark}
\linespread{1.05}
\renewcommand*{\raggedsection}{\centering}
% for centering part toc entry:
\makeatletter
\newcommand*{\specialparttocentryformat}[1]{%
\large\bfseries\sffamily%
\let\numberline@box\mbox%
\def\autodot{: }%
\centering%
#1%
}
\RedeclareSectionCommand[tocnumwidth=0pt,tocindent=0pt,tocentryformat=\specialparttocentryformat,toclinefill={},tocpagenumberbox=\@gobble,tocpagenumberwidth=0pt,tocrightindent=0pt,tocraggedpagenumber]{part}
\makeatother
\newcommand*{\up}{\large}
\newcommand*{\down}{\normalsize}
\newcommand*{\muc}[1]{\MakeUppercase{#1}}
\newcommand*{\bookonetoc}{\up F\down IRST BOOK}
\newcommand*{\bookonetopictoc}{\up C\down APITALS IN EUROPE}
\newcommand*{\partonetoc}{\up F\down IRST THEME}
\newcommand*{\partonetopictoc}{\up B\down ERLIN AND \up R\down OME}
\newcommand*{\dlb}{\\\vspace{\baselineskip}}% double line break
\newcommand*{\tlb}{\\\vspace{2\baselineskip}}% triple line break
\newcommand*{\lbtoc}{\texorpdfstring{\hspace{50em}}{: }}% line break in toc
\newcommand*{\dlbtoc}{\texorpdfstring{\hspace{50em}\textcolor{white}{--}\hspace{50em}}{ -- }}% double line break in toc
\begin{document}
\tableofcontents
\part[%
nonumber=true,%
tocentry={\bookonetoc\lbtoc\bookonetopictoc\dlbtoc\partonetoc\lbtoc\partonetopictoc}%
]%
{\huge\muc{First book}\dlb\muc{Capitals in europe}\tlb\LARGE\muc{First theme}\dlb\muc{Berlin and Rome}}
\end{document}
所以我希望字体大小可以灵活调整。此外,我更喜欢将书签条目全部大写。
顺便说一句:\hspace{50em}
当然是黑客行为。当我使用\\
时,行间距不一致。如果有人知道如何避免这种黑客行为,我当然很高兴听到。
答案1
假设您可以自由使用 LuaLaTeX,以下解决方案可能会让您感兴趣。它由一个名为 的 LaTeX 用户宏\badhack
和一个名为 的 Lua 后台函数组成badhack
。前者将其参数传递给后者以执行大部分工作。
请注意,的参数\badhack
可以是(LaTeX)宏。
% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{luacode} % for \luaexec macro
\begin{luacode}
function badhack ( s )
s = s:gsub ( "%u" , "{\\large %0}" ) -- enlarge uppercase letters
s = string.upper ( s )
tex.sprint ( ( s:gsub ( "\\LARGE", "\\large" ) ) )
end
\end{luacode}
\newcommand\badhack[1]{\directlua{badhack("#1")}}
\newcommand\PnR{Paris and Rome}
\begin{document}
\PnR
\textsc{\PnR} % this is ok
\badhack{\PnR} % and this is a bad hack!
\bfseries\sffamily
\PnR
\badhack{\PnR} % another bad hack
\end{document}