我正在编写自己的.sty
文件。它包含自己的目录和类似 的命令\section{}
,但什么都不起作用,因为目录文件的输出无法正常工作
输出结果如下:
\hyperref[mysection1]{\bfseries 3\hskip 1em\relax Section\dotfill \pageref {mysection1}}
\hyperref[mysection2]{\bfseries 3\hskip 1em\relax Section\dotfill \pageref {mysection2}}
它看起来是这样的:
\hyperref [mysection3]{\bfseries 3\hskip 1em\relax Section\dotfill \pageref {mysection3}}
\hyperref [mysection3]{\bfseries 3\hskip 1em\relax Section\dotfill \pageref {mysection3}}
.tex
以下是文件中的代码:
\documentclass[10pt]{article}
\usepackage{cmap}
\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english,russian]{babel}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{setspace}
\usepackage{hyperref}
\usepackage{mysty}
\begin{document}
\mytableofcontents
\section{Section}
\section{Section}
\end{document}
mysty.sty
以下是文件中的代码:
\RequirePackage{amsmath}
\RequirePackage{amssymb}
\RequirePackage{setspace}
\RequirePackage{hyperref}
\newwrite\myoutput
\immediate\openout\myoutput=toc.tex
\newcounter{sections}
\setcounter{sections}{1}
\renewcommand{\section}[1]{%
\vspace{2ex}
\label{mysection\the\value{sections}}%
\noindent\textbf{\arabic{sections}.\quad #1}%
\write\myoutput{\hyperref[mysection\the\value{sections}]{\bfseries\the\value{sections}\quad #1\dotfill\pageref{mysection\arabic{sections}}}}%
\stepcounter{sections}
\vspace{2ex}
}
\newcommand{\mytableofcontents}{%
\newpage\thispagestyle{empty}
\noindent\textbf{Table of Contents}
\input{toc}
\newpage
}
\endinput
答案1
很难理解为什么你要手动完成 LaTeX 内核本身可以做得更好的事情。
无论如何,\immediate\openout\myoutput
在.sty
文件中执行的操作会导致toc
文件在加载后立即被清除,因此您将得到没有什么在目录中。
你必须开始写它后目录(上次运行中所构建)已排版。
如果你这样做,你也不会得到锚点\stepcounter{sections}
。你需要\refstepcounter{sections}
在之前\label
(当然,不要将计数器初始化为 1)。
该代码的另一个明显缺点是,你必须将目录放在开头。按照标准,\tableofcontents
你可以将其放在任何地方。
您还需要保护命令不被内部扩展\write
。
这是你的代码的一个工作版本。但是你不应该自己动手:使用标准工具并对其进行自定义。例如,正如 David Carlisle 所指出的,您很可能在页面底部得到一个章节标题,文本则在下一页中。
检查差异。
\documentclass[10pt]{article}
\usepackage{cmap}
\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english,russian]{babel}
%\usepackage{mysty}
\makeatletter
\RequirePackage{amsmath}
\RequirePackage{amssymb}
\RequirePackage{setspace}
\RequirePackage{hyperref}
\newwrite\myoutput
\AtEndDocument{\immediate\closeout\myoutput}
\newcounter{sections}
\renewcommand{\section}[1]{%
\par\vspace{2ex}
\refstepcounter{sections}\label{mysection\the\value{sections}}%
\noindent\textbf{\arabic{sections}.\quad #1}%
\immediate\write\myoutput{%
\noindent
\noexpand\hyperref[mysection\the\value{sections}]{%
\noexpand\bfseries\the\value{sections}\noexpand\quad #1%
\noexpand\dotfill\noexpand\pageref{mysection\arabic{sections}}%
}%
\noexpand\par
}%
\par\vspace{2ex}
}
\newcommand{\mytableofcontents}{%
\newpage\thispagestyle{empty}
\noindent\textbf{Table of Contents}\par
\InputIfFileExists{\jobname.toc}{}%
\newpage
\immediate\openout\myoutput=\jobname.toc
}
\makeatother
\begin{document}
\mytableofcontents
\section{Section}
\section{Section}
\end{document}
答案2
你\immediate
之前错过了\write
。所以你不会对你拖延感到吃惊\write
。
在不进行其他更改的情况下添加\immediate
之前\write
会产生错误,因为的参数\write
会立即展开。您只想扩展\the\value{sections}
,仅此而已。
您的行\write
应该mysty.sty
是:
\immediate\write\myoutput
{\string\hyperref[mysection\the\value{sections}]{\noexpand\bfseries\the\value{sections}\quad #1\string\dotfill\string\pageref{mysection\the\value{sections}}}}%