.toc 파일에 수동으로 쓸 때 \contentsline의 네 번째 인수는 무엇입니까?

.toc 파일에 수동으로 쓸 때 \contentsline의 네 번째 인수는 무엇입니까?

목차를 수동으로 변경하고 싶습니다. 그 이유는 내 문서가 "섹션"이 아니라 "연습"으로 구성되어 있기 때문입니다. 이 작업을 수행하기 위해 사용자 정의된 명령을 작성했는데 거의 작동합니다. 다음 명령은 사용자 정의 .sty파일에 저장되며 다음 뒤에 로드됩니다 hyperref.

\def\numberline@exer#1{%
\makebox[50pt][l]{\bf Ex. #1\hspace*{1em}}
}

\def\exercise#1{%
\section*{#1}\refstepcounter{exercise}\phantomsection%
\write\@auxout{%
    \protect\@writefile{toc}{%
        \protect\contentsline {section}{\numberline@exer{\theexercise}Title}{\thepage}%
{????}% This is the fourth argument, defined by hyperref
        }%
    }%
}

이것은 기본적으로 북마크를 생성하지 않는다는 점을 제외하면 내가 원하는 것을 정확히 수행합니다. 이는 아마도 네 번째 주장 때문일 것입니다. 가 어떻게 hyperref재정의되는지 찾으려고 노력했지만 이해가 불가능하다는 것을 \contentsline알았습니다 .hyperref.sty

그래서 내 질문은 이렇습니다. 내 정의에서 네 번째 주장은 무엇이어야 합니까? 또한 이 네 번째 주장이 어떻게 작동하는지 알고 싶지만 우선순위가 낮습니다.

주의: 저는 ToC를 사용자 정의할 수 있는 패키지를 설치하는 데 관심이 없습니다. 나는 이것을 연습으로 하고 있으므로 이를 위해 내 파일을 사용하고 싶습니다 .sty.

답변1

일반적으로 등의 모든 변경 사항은 로드되기 \contentsline전에 수행되어야 하며 , 이후에는 에 의해 추가되는 의 인수를 hyperref고려해야 합니다 .4th\contentslinehyperref

인수 4th는 하이퍼앵커, 즉 section.1or 와 같은 것입니다 east.17.

하이퍼앵커는 를 사용하여 삽입할 수 있으며 , 이는 사용된 \@currentHref이후 올바른 앵커를 제공해야 합니다 .\phantomsection

북마크를 추가하려면 자체적 \Hy@writebookmark으로 북마크를 추가하지 않으므로 를 사용하세요 . 여기서는 '우회'되는 \contentsline래퍼 명령에서 수행됩니다 .\addcontentsline

\documentclass{article}


\usepackage[bookmarksopen]{hyperref}


\newcounter{exercise}


\makeatletter

\def\numberline@exer#1{%
\makebox[50pt][l]{\bfseries Ex. #1\hspace*{1em}}
}

\def\exercise#1{%
  \phantomsection
  \refstepcounter{exercise}
  \section*{#1}%
  \Hy@writebookmark{\csname theexercise\endcsname}{#1}{\@currentHref}{\toclevel@section}{toc}
  \write\@auxout{%
    \protect\@writefile{toc}{%
      \protect\contentsline {section}{\numberline@exer{\theexercise}#1}{\thepage}{\@currentHref}%
    }%
  }%

}
\makeatother

\usepackage{blindtext}

\begin{document}
\tableofcontents

\section{First section}\label{foosection}

\clearpage

\blindtext[3]
\exercise{Foo}
\blindtext[2]


\end{document}

여기에 이미지 설명을 입력하세요

업데이트평소 버전 \addcontentsline:

\documentclass{article}


\usepackage[bookmarksopen]{hyperref}


\newcounter{exercise}


\makeatletter

\newcommand*\l@exercise[2]{%
  \ifnum \c@tocdepth >\z@
    \addpenalty\@secpenalty
    \addvspace{1.0em \@plus\p@}%
    \setlength\@tempdima{3.8em}%
    \begingroup
      \parindent \z@ \rightskip \@pnumwidth
      \parfillskip -\@pnumwidth
      \leavevmode \bfseries
      \advance\leftskip\@tempdima
      \hskip -\leftskip
      #1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par
    \endgroup
  \fi}



\let\toclevel@exercise\toclevel@section

\newcommand{\exercisebetter}[1]{%
  \refstepcounter{exercise}
  \section*{#1}%
  \addcontentsline{toc}{exercise}{\protect\numberline{Ex: \theexercise}#1}
}


\makeatother

\usepackage{blindtext}

\begin{document}
\tableofcontents

\section{First section}\label{foosection}

\clearpage

\blindtext[3]

\exercisebetter{Foobar}
\blindtext[2]


\end{document}

답변2

\write\@auxout직접 사용하지 말고 를 사용하는 것이 좋습니다 \addcontentsline. 취약한 명령을 보호하는 데 사용할 수 있도록 \addcontentsline자동으로 존중 \nofile하고 사용합니다 . 그리고 를 사용하면 북마크 등을 자동으로 처리합니다 . 따라서 added by 의 네 번째 인수를 설정하는 방법을 알 필요가 없습니다 . 사용 여부와 독립적으로 작동하는 (그리고 추가 코드 전후에 로드되는지 여부에 관계없이 ) 매우 간단한 솔루션은 다음과 같습니다.\protected@write\protecthyperref\addcontentsline\contentshyperrefhyperrefhyperref

\documentclass{article}
\usepackage[bookmarksopen]{hyperref}

\providecommand*{\texorpdfstring}[2]{#1}% Needed if `hyperref` is not used.
\newcounter{exercise}
\makeatletter
\def\numberline@exer#1{%
  \texorpdfstring{\makebox[50pt][l]{\bfseries Ex. #1\hspace*{1em}}}{Ex. #1}
}

\newcommand\l@exercise{\l@section}
\newcommand*{\exercise}{%
  \@dblarg\@exercise
}
\newcommand*{\@exercise}[2][]{%
  \refstepcounter{exercise}%
  \section*{#2}%
  \addcontentsline{toc}{exercise}{\protect\numberline@exer{\theexercise}#1}%
}
\let\toclevel@exercise\toclevel@section
\makeatother

\usepackage{blindtext}

\begin{document}
\tableofcontents

\section{First section}\label{foosection}

\clearpage

\blindtext[3]
\exercise{Foo}
\blindtext[2]
\exercise[Bar]{Foo-Bar}
\blindtext

\end{document}

이 솔루션을 사용하면 \exercise목차 \section에 대해 설정할 선택적 인수와 다른 텍스트도 있습니다. \exercise[Bar]{Foo-Bar}예제를 참조하세요 .

관련 정보