我希望我的章节(以及可能的子章节)无论我如何输入,都能采用“句子大小写”格式。我对\MakeSentenceCase
宏的输入方式很满意biblatex
包将任意大小写的文本转换为句子大小写。我很难将其集成到\section
宏中。
我的第一次尝试是重新\section
定义
\renewcommand{\section}{\@startsection{section}{1}{\z@}{-3.5ex \@plus -1ex \@minus -.2ex}{2.3ex \@plus.2ex}{\normalfont\Large\bfseries\MakeSentenceCase}}
但这种方法失败了,因为第一个标记(或类似标记)不是\MakeSentenceCase
我的节标题文本的第一个标记,而是与编号和缩进有关。以下方法有效
\documentclass{article}
\usepackage{etoolbox}
\usepackage[backend=biber]{biblatex}
\makeatletter
\let\sectionOrig\section
\renewcommand{\section}{\@ifstar{\@sectionStar}{\@sectionNoStar}}%
\newcommand{\@sectionNoStar}[2][\relax]{\ifdefstring{\relax}{#1}{%
\sectionOrig{\MakeSentenceCase{#2}}%
}{%
\sectionOrig[#1]{\MakeSentenceCase{#2}}%
}}
\newcommand{\@sectionStar}[1]{\sectionOrig*{\MakeSentenceCase{#1}}}%
\makeatother
\begin{document}
\section{sections SHOULD BE IN {SENTENCECASE}}
\end{document}
通过完全重新定义\section
命令。我曾尝试处理带星号和不带星号的表格以及可选参数,但我担心这种方法会在其他地方引起问题。
我想我有 3 个问题。首先,期望 LaTeX 自动处理章节的大写是否合理。其次,我的方法是否合理。第三,是否有更好的方法(或已有的包)。
答案1
这很容易使用titlesec
包。使用explicit
选项(第 8 页,第 3.7 节),我们可以对存储为的节标题使用(我认为)任意转换#1
。有了这些知识,剩下的就变得小菜一碟了:
\documentclass[twocolumn]{article} % two-column used to get everything onto one page
\usepackage{biblatex}
\usepackage[explicit]{titlesec} % note the `explicit` option
\titleformat{\section} % The normal, unstarred version
{\Large\bfseries}{}{2ex}
{\thesection. \MakeSentenceCase{#1}}
\titleformat{name=\section,numberless} % The starred version; note the `numberless` key
{\Large\bfseries}{}{2ex}
{\MakeSentenceCase{#1}}
\usepackage{mwe}
\begin{document}
\section{I am a Section}
\lipsum[1]
\section{I am An Other section}
\lipsum[2]
\section*{I am an UnNumBeReD section with {ACRO}-nyms}
\lipsum[3]
\section{I am a Section}
\lipsum[4]
\section{I am An Other section}
\lipsum[5]
\section{More {ACR}-o-{NYM}s!}
\end{document}
\section
(请注意,只需适当替换和,即可轻松将此解决方案应用于其他分段命令\thesection
。)
至于您的其他问题:
- 只要你不是期望 LaTeX 能够实现/遵循任意语言的花哨的大小写规则(例如标题大小写),那么你美好的。TeX 知道所有字母之间的关系(大写/小写),并可以在必要时在它们之间进行交换。所谓的“愚蠢”的大小写控制(例如,将首字母大写,其余字母小写)是完全合理的。
- 如果您的方法效果良好,那么它就是合理的,但通常最好在现有包(例如
titlesec
)的基础上构建以获得更多功能。(例如,如果您编写了自己的\MakeSentenceCase
,那可能有点太费事了——大量的代码意味着很大的空间会出现小错误。)