如何将章节转换为句子大小写

如何将章节转换为句子大小写

我希望我的章节(以及可能的子章节)无论我如何输入,都能采用“句子大小写”格式。我对\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,那可能有点太费事了——大量的代码意味着很大的空间会出现小错误。)

相关内容