我使用 PDFLaTeX 设计练习模板。我希望练习的标签能够根据章节号和练习号自动给出,并且我还希望在 PDF 文件的书签中显示练习号。灵感来自当编号完全是手动的时候,排版定理等的最直接的方法是什么?,我尝试以下代码:
\documentclass{book}
\usepackage{amsthm}
\usepackage{hyperref}
\makeatletter
\newtheorem{ex}{Exercise}[chapter]
\newenvironment{exx}[1]{\def\@currentlabel{#1}
\ex\label{\@currentlabel}
\pdfbookmark[1]{Exercise~~\@currentlabel}{\@currentlabel}
}{\endex}
\makeatother
\newcommand{\exref}[1]{Exercise~\textup{\ref{#1}}}
\begin{document}
\setcounter{chapter}{3}
\chapter{Hello Chapter 4}
\begin{exx}
Exercise A.
\end{exx}
\begin{exx}
Exercise B.
\end{exx}
By \exref{4.1} and \exref{4.2}
\end{document}
它可以工作,但会出现一些问题,这表明
Exercise 4.1. xercise A.
Exercise 4.2. xercise B.
By Exercise 4.1 and Exercise 4.2
例如,练习的首字母丢失了!当然,我们可以通过替换 \begin{exx}{}
来避免这种情况\begin{exx}
,但我不想这样,除非我想为练习重新定义新的标签,即
\begin{exx}
Exercise A.
\end{exx}
\exref{4.1}
和
\begin{exx}{newLabel41}
Exercise A.
\end{exx}
\exref{newLabel41}
给出相同的结果。有什么帮助吗?
答案1
您可能对可选参数感兴趣,而不是强制参数。使用后者 - 您当前的设置使用\newenvironment{exx}[1]
- 它会将环境主体中的第一个字母作为强制参数。使用可选参数 - 使用\newenvironment{exx}[1][]
-你可以测试它是否被使用过并使用不同的\label
。
\documentclass{book}
\usepackage{amsthm}
\usepackage{hyperref}
\makeatletter
\newtheorem{ex}{Exercise}[chapter]
\newenvironment{exx}[1][]{%
\begin{ex}
% https://tex.stackexchange.com/q/53068/5764
\if\relax\detokenize{#1}\relax
\label{\@currentlabel}%
\else
\label{#1}%
\fi
\pdfbookmark[1]{Exercise~~\@currentlabel}{\@currentlabel}
}{%
\end{ex}
}
\makeatother
\newcommand{\exref}[1]{Exercise~\textup{\ref{#1}}}
\begin{document}
\setcounter{chapter}{3}
\chapter{Hello Chapter 4}
\begin{exx}
Exercise A.
\end{exx}
\begin{exx}
Exercise B.
\end{exx}
See \exref{4.1} and \exref{4.2}, but also \exref{ex:next}.
\begin{exx}[ex:next]
Exercise C.
\end{exx}
\end{document}