在 LaTeX 中,所有字体命令都有两个版本,一个需要参数(\textbf
、\textit
等\textsc
),另一个更改字体直到组结束(\bfseries
、\itshape
等\scshape
)。后者在为某些包或类文件中的某些自动生成的文本定义字体时特别有用。例如,使用回忆录类:
\captionnamefont{\small\scshape}
或者
\renewcommand*{\chapnamefont}{\Large\sffamily\bfseries}
\setsecheadstyle{\Large\sffamily\raggedright}
但是,现在我需要一个类似的命令来将文本变为大写。\MakeUppercase
需要一个参数,但我不知道是否有解决方案可以使所有文本都变为大写直到组结束,以便我可以执行类似操作:
\captionnamefont{\small\bfseries\lsstyle\MakeUppercaseUntilEndOfGroup}
如果不存在这样的命令,为了使这个特定的案例起作用,我想我需要修补一些内部回忆录命令,如下所示:
\makeatletter
\renewcommand{\fnum@figure}[1]{\small\bfseries\lsstyle\lsstyle\MakeUppercase{\figurename~\thefigure}\quad}
\makeatother
然而,这是相当不优雅和有限的;除了对于其他命令,例如\setsecheadstyle
这个命令必须重复,即使对于浮点数,只有标题人物都改变了。我还有由该\newfloat
命令定义的表格和其他自定义浮点类型。那么是否可以简单地为文档中的每种浮点类型定义这种新样式?我想有一些代码可以创建新的浮点类型,也许应该对其进行修补...
答案1
如果我理解正确的话,您希望能够使用来更改 的所有标题\captionnamefont{\small\bfseries\lsstyle\MakeUppercase}
的外观。实现此目的的一种可能性是修补使用设置的命令的使用位置。memoir
\@makecaption
\captionnamefont
\captionnamefont
只是重新定义了\@contnfont
。此命令现在在五个不同的地方使用\@makecaption
(由于一些条件),方式如下:\@contnfont #1\@contdelim
。
下面的例子将所有这些外观改为,\@contnfont{#1\@contdelim}
以便中的最后一个命令\captionnamefont
可以有一个参数:
\documentclass{memoir}
\usepackage{microtype}
\usepackage{etoolbox}
\makeatletter
\patchcmd[\long]{\@makecaption}
{\@contnfont #1\@contdelim}
{\@contnfont{#1\@contdelim}}
{}{}
\patchcmd[\long]{\@makecaption}
{\@contnfont #1\@contdelim}
{\@contnfont{#1\@contdelim}}
{}{}
\patchcmd[\long]{\@makecaption}
{\@contnfont #1\@contdelim}
{\@contnfont{#1\@contdelim}}
{}{}
\patchcmd[\long]{\@makecaption}
{\@contnfont #1\@contdelim}
{\@contnfont{#1\@contdelim}}
{}{}
\patchcmd[\long]{\@makecaption}
{\@contnfont #1\@contdelim}
{\@contnfont{#1\@contdelim}}
{}{}
\makeatother
\captionnamefont{\small\bfseries\lsstyle\MakeUppercase}
\begin{document}
\begin{table}[ht]
\caption{test caption}
\end{table}
\end{document}
答案2
我已经为自己的问题想出了一个半优雅的答案,但我仍在等待更好的答案。
我没有采用建议的方法来修补创建新浮点类型的回忆录代码,而是想出了一个宏来单独修补每个浮点类型。但至少有一种集中的方法来指定所有浮点标题的样式:
\makeatletter
\def\redeffloatcapstyle#1{%
\expandafter\renewcommand\expandafter{\csname fnum@#1\endcsname}[1]{%
\small\bfseries\lsstyle\MakeUppercase{%
\expandafter{\csname #1name\endcsname}~\expandafter{\csname the#1\endcsname}\quad
}
}
}
\makeatother
\redeffloatcapstyle{figure}
\redeffloatcapstyle{table}
% add your own new float types here; you might have to first define \newfloattypename, like this:
\def\codelistingname{Code Listing}
\newfloat{codelisting}{lcd}{\codelistingname}
\newcommand{\cdref}[1]{\codelistingname~\ref{#1}}
\redeffloatcapstyle{codelisting}
使用这个宏,说\redeffloatcapstyle{whatever}
就相当于说:
\renewcommand{\fnum@whatever}[1]{\small\bfseries\lsstyle\MakeUppercase{\whatevername~\thewhatever}\quad}
这有点帮助,但如果我们只是修补定义新浮点类型的回忆录代码,那就不够优雅了。所以,仍在等待答案……
答案3
非 LaTeX-y,并且可能与 XeTeX 一起使用的有点迂回的方法是制作一个映射文件,如下所示:
; caps.map
LHSName "Caps"
RHSName "UNICODE"
pass(unicode)
U+0061 > U+0041
U+0062 > U+0042
U+0063 > U+0043
; ...
U+007A > U+005A
(编译使用teckit_compile caps.map
)
并在加载字体时使用映射:
\font\caps="Latin Modern Roman:mapping=caps"
然后你可以做
{\caps All of this would be in caps}