如何在目录的非编号部分添加缩进?

如何在目录的非编号部分添加缩进?

我用它\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
    }

但…

  1. 我无法再编译它,我不知道为什么(Argument of \@ssect has an extra }错误)。
  2. 昨天它可以在我的文档上以所需的外观工作,但我仍然遇到问题,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

使用unnumberedtotoc

遗漏未编号

\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}

相关内容