我想要将“\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}