用于创建“手动”小型大写字母的解析器

用于创建“手动”小型大写字母的解析器

我希望将部分 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}

答案2

这不是迄今为止编写的最强大或容错能力最强的解析器,但它至少在两种情况下有效:

在此处输入图片描述

\documentclass{article}

\def\zz#1{\zzz#1 = \unskip}

\def\zzz#1#2 {%
\ifx=#1%
\else
\ifnum\lccode`#1=`#1%
\uppercase{#1#2}%
\else
{\Large#1}\uppercase{#2}%
\fi
\space
\expandafter
\zzz
\fi}

\begin{document}

[\zz{abc}]

[\zz{Paris and Rome}]


\end{document}

相关内容