我用它\setcounter{secnumdepth}{0}
来显示不带任何数字的部分。它按预期工作,但我希望有一些缩进来对齐文本的开头。
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{hyperref}
\usepackage{blindtext}
\usepackage{filecontents}
\begin{filecontents}{text1.tex}
\section{text 1}
\blindtext
\end{filecontents}
\begin{filecontents}{text2.tex}
\section{text 2}
\blindtext
\end{filecontents}
\begin{filecontents}{text3.tex}
\section{text 3}
\blindtext
\end{filecontents}
\begin{filecontents}{text4.tex}
\section{text 4}
\blindtext
\end{filecontents}
\newcommand{\inputa}[1]{%
\setcounter{secnumdepth}{0}
\input{#1}
\setcounter{secnumdepth}{1}
}
\begin{document}
\input{text1.tex}
\inputa{text2.tex}
\input{text3.tex}
\input{text4.tex}
\tableofcontents
\end{document}
我希望所有单词“text”都对齐。
[根据 Phelype Oleinik 的回答进行编辑]
关于建议的无星号方法:我不会手动更改由许多不同的 .tex 文件组成的众多部分。我曾经尝试过使用\inputa
类似以下命令自动编写命令:
\newcounter{starlab}%counter for a label to use with \nameref
\newcommand{\inputa}[1]{%
\let\origsection\section
\renewcommand{\section}{% force starred section
\@ifstar{\origsection*}{\origsection*}}
\input{#1}
\refstepcounter{starlab}\label{sec:\thestarlab}
\addcontentsline{toc}{section}{\protect\numberline{}\nameref{sec:\thestarlab}}
\let\orgisection\section
}
但…
- 我无法再编译它,我不知道为什么(
Argument of \@ssect has an extra }
错误)。 - 昨天它可以在我的文档上以所需的外观工作,但我仍然遇到问题,
hypperef
因为标签指向文本的末尾,而这些文本有时很长。
答案1
你可以这样做etoc
。
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{blindtext}
\usepackage{hyperref}
\usepackage{etoc}
\etocsetstyle{section}
{}
{\etocifnumbered
{\etocsavedsectiontocline{\numberline{\etocnumber}\etocname}{\etocpage}}
{\etocsavedsectiontocline{\numberline{}\etocname}{\etocpage}}%
}
{}
{}
\begin{document}
\tableofcontents
\section{Alpaca}
\blindtext
\setcounter{secnumdepth}{0}
\section{Capybara}
\setcounter{secnumdepth}{1}
\blindtext
\section{Ant}
\blindtext
\end{document}
这是来自 OP 的 MWE。
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{hyperref}
\usepackage{blindtext}
\usepackage{etoc}
\etocsetstyle{section}
{}
{\etocifnumbered
{\etocsavedsectiontocline{\numberline{\etocnumber}\etocname}{\etocpage}}
{\etocsavedsectiontocline{\numberline{}\etocname}{\etocpage}}%
}
{}
{}
\usepackage{filecontents}
\begin{filecontents}{text1.tex}
\section{text 1}
\blindtext
\end{filecontents}
\begin{filecontents}{text2.tex}
\section{text 2}
\blindtext
\end{filecontents}
\begin{filecontents}{text3.tex}
\section{text 3}
\blindtext
\end{filecontents}
\begin{filecontents}{text4.tex}
\section{text 4}
\blindtext
\end{filecontents}
\newcommand{\inputa}[1]{%
\setcounter{secnumdepth}{0}
\input{#1}
\setcounter{secnumdepth}{1}
}
\begin{document}
\input{text1.tex}
\inputa{text2.tex}
\input{text3.tex}
\input{text4.tex}
\tableofcontents
\end{document}
答案2
我稍微改变了你的方法...你可以使用带星号的版本来添加无数字的部分,而不是secnumdepth
在文档中间进行更改。\section*
(如果坚持要改变secnumdepth
,请参阅答案的第二部分)。
然后您可以使用\addcontentsline{toc}{section}{text 2}
将此部分的条目添加到目录中。
更好的是!你可以使用
\section*{text 2}
\addcontentsline{toc}{section}{\numberline{}text 2}
并且缩进将保留在目录中,正如您所希望的那样:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{hyperref}
\usepackage{blindtext}
\begin{document}
\section{text 1}
\blindtext
\section*{text 2}
\addcontentsline{toc}{section}{\numberline{}text 2}
\blindtext
\section{text 3}
\blindtext
\section{text 4}
\blindtext
\tableofcontents
\end{document}
为了减少手动操作,你可以定义一个命令,比如说,\nonumbersection
完成整个事情:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{hyperref}
\usepackage{blindtext}
\makeatletter
\def\nonumbersection{\@dblarg\@nnsection}
\def\@nnsection[#1]#2{%
\section*{#2}%
\sectionmark{#1}%
\addcontentsline{toc}{section}{\numberline{}#1}}
\makeatother
\begin{document}
\section{text 1}
\blindtext
\nonumbersection{text 2}
\blindtext
\section{text 3}
\blindtext
\section{text 4}
\blindtext
\nonumbersection[t5]{text 5}
\blindtext
\tableofcontents
\end{document}
根据您的编辑,如果您坚持保留该secnumdepth
方法:
你的定义\inputa
是几乎正确,除了:
、、和
\refstepcounter
\label
\addcontentsline
应该里面的新定义\section
,因为这个\section
命令将位于 内部\input
,如果您将 放在\label
之后就\input
太晚了,并且引用将是错误的(正如您自己得出的结论);的重新定义
\section
不正确。您有\let\orgisection\section
,这会将 复制到\section
,\orgisection
但您想要相反的结果,因此它是\let\section\orgisection
;是
\origsection
:P
更正后,您的代码将按预期工作:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{hyperref}
\usepackage{blindtext}
\usepackage{filecontents}
\begin{filecontents}{text1.tex}
\section{text 1}
\blindtext
\end{filecontents}
\begin{filecontents}{text2.tex}
\section{text 2}
\blindtext
\end{filecontents}
\begin{filecontents}{text3.tex}
\section{text 3}
\blindtext
\end{filecontents}
\begin{filecontents}{text4.tex}
\section{text 4}
\blindtext
\end{filecontents}
\makeatletter
\newcounter{starlab}%counter for a label to use with \nameref
\newcommand{\inputa}[1]{%
\let\origsection\section
\def\section{%
\refstepcounter{starlab}%
\label{sec:\thestarlab}%
\addcontentsline{toc}{section}{\protect\numberline{}\nameref{sec:\thestarlab}}
\@ifstar{\origsection*}{\origsection*}}
\input{#1}
\let\section\origsection}
\makeatother
\begin{document}
\input{text1.tex}
\inputa{text2.tex}
\input{text3.tex}
\input{text4.tex}
\tableofcontents
\end{document}
答案3
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{blindtext}
\usepackage[indentunnumbered]{unnumberedtotoc}%<----------
\usepackage{hyperref}
\begin{document}
\tableofcontents
\section{Alpaca}
\blindtext
\addsec[Wombat]{Capybara}
\blindtext
\section{Ant}
\blindtext
\end{document}