自动标签编号和相应引用

自动标签编号和相应引用

我使用 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}

相关内容