목차를 수동으로 변경하고 싶습니다. 그 이유는 내 문서가 "섹션"이 아니라 "연습"으로 구성되어 있기 때문입니다. 이 작업을 수행하기 위해 사용자 정의된 명령을 작성했는데 거의 작동합니다. 다음 명령은 사용자 정의 .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
\contentsline
hyperref
인수 4th
는 하이퍼앵커, 즉 section.1
or 와 같은 것입니다 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
\protect
hyperref
\addcontentsline
\contents
hyperref
hyperref
hyperref
\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}
예제를 참조하세요 .