不工作 \immediate\write

不工作 \immediate\write

我正在编写自己的.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}}}}%

相关内容