是否有可能引用文档的章节和节而不用手动标记每个节和小节?
我有大约 8 个章节和其中缩进的数十个节/小节,标记每个节非常繁琐。
有没有更快捷,更方便的方法?
答案1
这可以做到,但可能有风险;在下面的例子中,每次调用 或 时,都会自动获取每个章节或部分的第一个单词来构建标签\chapter
;\section
其titlesec
选项explicit
用于抓取标题;使用xstring
,提取第一个单词:
\documentclass[10pt]{book}
\usepackage[explicit]{titlesec}
\usepackage{xstring}
\titleformat{\chapter}[display]
{\normalfont\huge\bfseries}{\chaptertitlename\ \thechapter}{20pt}{\Huge\StrBefore{#1}{ }[\mlabel]#1\label{\mlabel}}
\titleformat{\section}
{\normalfont\Large\bfseries}{\thesection}{1em}{\StrBefore{#1}{ }[\mlabel]#1\label{\mlabel}}
\begin{document}
Some references to chapters: \ref{Some} and \ref{Other} and some references to sections: \ref{A} and \ref{Another}
\chapter{Some Chapter}
\section{A Test Section}
\chapter{Other Chapter}
\section{Another Test Section}
\end{document}
如果两个部门单位的标题具有相同的首词,则此操作将会失败,但您可以选择不同的字符串来构建标签。
在我最初的解决方案中,我假设标题至少包含一个空格,但可以使用另一个字符串;例如(如尼古拉·罗斯托夫的答案)部门单位的全名。在这种情况下,不再需要 xstring 包,只需说
\documentclass[10pt]{book}
\usepackage[explicit]{titlesec}
\titleformat{\chapter}[display]
{\normalfont\huge\bfseries}{\chaptertitlename\ \thechapter}{20pt}{\Huge#1\label{#1}}
\titleformat{\section}
{\normalfont\Large\bfseries}{\thesection}{1em}{#1\label{#1}}
\begin{document}
Some references to chapters: \ref{Some Chapter} and \ref{Other Chapter} and some references to sections: \ref{A Test Section} and \ref{Another Test Section}
\chapter{Some Chapter}
\section{A Test Section}
\chapter{Other Chapter}
\section{Another Test Section}
\end{document}
我的例子仅展示了章节和部分的机制,但它可以轻松扩展到其他部分单元。
答案2
您可以使用完整标题章节或部分作为标签,并通过其自己的标题来引用它们。
\documentclass{book}
\let\origchapter=\chapter
\let\origsection=\section
\renewcommand\chapter[1]{\origchapter{#1}\label{#1}}
\renewcommand\section[1]{\origsection{#1}\label{#1}}
\begin{document}
\chapter{My first chapter}
\section{My first section}
I said in section~\ref{My first section} at the
beginning of chapter~\ref{My first chapter} that
\end{document}
答案3
您可以自动执行标签创建过程。一个非常基本的 perl 脚本就可以做到这一点。perl 脚本必须将所有.tex
文件都放在一起,然后逐个对它们运行替换正则表达式。以下是您应该使用的正则表达式的示例:
my $input_str = do{ local $/; <> };
$input_str =~ s/(\\section{(.*?)}(?!\s*\\label))/$1\n\\label{sec:$2}/mg;
$input_str =~ s/(\\chapter{(.*?)}(?!\s*\\label))/$1\n\\label{chap:$2}/mg;
print $input_str;
这两个正则表达式将简单地在您的 tex 代码中查找每个\chapter{Chapter Title}
和\section{Section Name}
。如果它们之后定义了标签,则脚本将忽略它们。如果没有,脚本将在新行上为它们添加一个标签语句,内容为\label{chap:Chapter Title}
和\label{sec:Section Name}
。您可以创建此 perl 脚本并在创建新的节/章节时运行它。
免责声明:我对您在文件上运行正则表达式时可能遇到的任何数据丢失概不负责.tex
。虽然我测试了上述正则表达式,但我故意没有包含完整的 perl 脚本代码,以避免此类风险。如果您将我的 perl 代码剪切并粘贴到脚本中,然后在文件上运行它,您仍然可以查看它的运行情况.tex
。它将运行并在屏幕上打印结果,而无需修改您的文件。请确保编写自己的 Perl 脚本并在虚拟文件上进行测试.tex
。此外,在运行此类脚本之前,请务必始终复制您的工作。