如何将“\section”参数中第一个单词的首字母大写?

如何将“\section”参数中第一个单词的首字母大写?

我想要将“\section”\command 参数中第一个单词的首字母大写。

考虑\newcommand{\hello}{hello world}

我想使用

\section{\hello} 

因此编译后的节头是

0.1 Hello world  

我试过

\titleformat{\section}
   {\normalfont\Large\bfseries\expandafter\MakeUppercase }{\thesection}{1em}{}

但那又回来了HELLO WORLD

我怎样才能只将第一个单词大写,以便得到

0.1 Hello world  

有没有办法将标题也延续到目录中?

\let\TEMPtableofcontents\tableofcontents
\renewcommand{\tableofcontents}{
  \clearemptydoublepage
  \providecommand\phantomsection{} \phantomsection
  \addcontentsline{toc}{chapter}{Table of Contents}
  \TEMPtableofcontents
}

答案1

Skillmon 答案的简化版本。这应该适用于具有标准语法的每个类\section

\documentclass{article}

\ExplSyntaxOn
\cs_new_eq:NN \titlecasefirst \text_titlecase_first:n
\ExplSyntaxOff

\NewCommandCopy{\latexsection}{\section}
\RenewDocumentCommand{\section}{sO{#3}m}{%
  \IfBooleanTF{#1}{%
    \latexsection*{\titlecasefirst{#3}}
  }{%
    \latexsection[\titlecasefirst{#2}]{\titlecasefirst{#3}}%
  }%
}

\newcommand{\hello}{hello world}

\begin{document}
\tableofcontents
\section{\hello}
\section[again \hello]{Again \hello{} but much longer}
\end{document}

在此处输入图片描述

答案2

以下内容适用于(或多或少)最新的 LaTeX 安装。

\documentclass{article}

\ExplSyntaxOn
\cs_new_eq:NN \titlecasefirst \text_titlecase_first:n
\ExplSyntaxOff

\usepackage{titlesec}

\titleformat{\section}
  {\normalfont\Large\bfseries}{\thesection}{1em}{\titlecasefirst}

\newcommand{\hello}{hello world}

\begin{document}
\section{\hello}
\end{document}

但目录不会包含更改后的标题。为了使目录也受到影响,以下内容或多或少假设了标准类行为。

它修补 Toc () 中的宏格式化部分条目,\l@section以将其参数更改为结果,就好像\section{\protect\titlecasefirst{<title>}}总是使用而不是一样\section{<title>}

\documentclass{article}

\ExplSyntaxOn
\cs_new_eq:NN \titlecasefirst \text_titlecase_first:n
\ExplSyntaxOff

\usepackage{titlesec}

\titleformat{\section}
  {\normalfont\Large\bfseries}{\thesection}{1em}{\titlecasefirst}

\makeatletter
\AtBeginDocument
  {%
    \NewCommandCopy\l@section@orig\l@section
    \renewcommand\l@section[1]
      {%
        \expandafter\l@section@orig\expanded
          {{\iffalse{{\fi\l@section@titlecasefirst#1}}}}%
      }%
  }
\newcommand\l@section@titlecasefirst[2]
  {%
    \unexpanded{#1{#2}}%
    \unexpanded\expandafter
      {\expandafter\titlecasefirst\expandafter{\iffalse}}\fi
  }
\makeatother

\newcommand{\hello}{hello world}

\begin{document}
\tableofcontents
\section{\hello}
\end{document}

在此处输入图片描述

答案3

这是一个基于 LuaLaTeX 的解决方案。无需具备 Lua(编程语言)知识。它既适用于目录,也适用于文档主体。它不仅适用于\section指令的参数,也适用于命令的\subsection参数\subsubsection

如果你是 LuaLaTeX 新手,你需要对序言进行的唯一值得注意的更改是 (a) 确保fontenc\inputenc包是不是(b)该fontspec包已加载。

在此处输入图片描述

% !TEX TS-program = lualatex
\documentclass{report}      % or some other suitable document class
\setcounter{secnumdepth}{3} % just for this sample document 
\setcounter{tocdepth}{3} 

\usepackage{luacode}
% Define two Lua functions:
\begin{luacode}
function makefirstcap ( s )
   return ( string.upper ( s:sub (1,1) ) .. s:sub ( 2 ) )
end
function first2cap  ( s )
   s = tostring ( s )
   s = s:gsub ( "(\\.-section)%s*{%s*(.-)}" , 
                function ( x , y )
                   return ( x .."{".. makefirstcap ( y ) .. "}" ) 
                end )
   return s 
end
\end{luacode}

% Assign 'first2cap' function to LuaTeX's "process_input_buffer" callback
\AtBeginDocument{\directlua{luatexbase.add_to_callback (
   "process_input_buffer" , first2cap , "first2cap" )}}

\usepackage{fontspec} % don't load either fontenc or inputenc

\begin{document}

\tableofcontents
\bigskip\hrule\bigskip

\setcounter{chapter}{2} % just for this example

\section{hello world} 
\subsection {goodbye} \subsubsection{ the end} 
\subsubsection { what?! }
\end{document}

相关内容