假设我的部分有不同的名称,一个简单的问题:是否有任何方法可以使用文档中的交叉引用来定位到部分,而无需在部分中使用标记?例如,使用类似这样的方法可能会很有用:
\ref{namesection}
答案1
\section
这是一个基于 LuaLaTeX 的解决方案。它不会修改、\subsection
和的定义\subsubsection
。这很有用,因为如果分段命令包含可能出现在目录中的可选参数,则不会出现任何问题。相反,该解决方案设置了一个 Lua 函数,该函数在处理的早期阶段(在 LaTeX 开始其常规处理之前)扫描输入行,并自动将所有实例替换为\section{...}
。\section{...}\label{...}
唯一的输入语法要求是\section
命令及其相关的完整参数都在一行上——不允许换行。
综上所述,我想说必须手动提供一些\label
语句会更容易......
% !TeX program = lualatex
\documentclass{article}
\usepackage{luacode}
\begin{luacode}
function add_label ( s )
return ( string.gsub ( s , "(\\.-section.*)(%b{})", "%1%2\\label%2" ) )
end
\end{luacode}
\AtBeginDocument{\directlua{luatexbase.add_to_callback(
"process_input_buffer" , add_label , "add_label" )}}
\begin{document}
\tableofcontents
\section[Hello]{Hello World} % note: no "\label" statement
\subsection[Goodbye]{Goodbye World} % note: no "\label" statement
A cross-reference to section \ref{Hello World}.
\noindent
Another cross-reference to subsection \ref{Goodbye World}.
\end{document}
答案2
当然可以,但要小心:
\documentclass{article}
\usepackage{xparse,lipsum}
\let\oldsection\section
\RenewDocumentCommand{\section}{s o m}{%
\IfBooleanTF{#1}
{% \section*
\oldsection*{#3}% \section*[.]{..}
}{% \section
\IfValueTF{#2}
{\oldsection[#2]{#3}}% \section[.]{..}
{\oldsection{#3}}% \section{..}
}%
\label{#3}% Force label to match section title
}
\begin{document}
See Section~\ref{A section}.
\section{A section}
% This won't work
% \section{Another \textit{beautiful} section}
\end{document}
为了设置与\label
章节标题匹配的,我们重写\section
(使用xparse
,以便于使用)。
请注意,章节标题内的格式(和其他内容)可能会导致问题。