我正在使用以下代码编译笔记末尾的所有定义列表,有点像词汇表,但自动化了。但是,输出中定义的格式存在问题: - 只有前两个定义以粗体显示单词“定义 4.1”左右,并且左对齐,而所有后续定义都居中对齐,没有粗体部分。我不明白为什么会发生这种情况,也不知道我应该做哪些更改。
\documentclass{book}
\usepackage{amsmath, amssymb, amsthm, latexsym}
\theoremstyle{plain}
\newtheorem{thm}{Theorem}[chapter]
\usepackage{environ}
\theoremstyle{definition}
\newtheorem{defnINN}{Definition}[chapter]
\makeatletter
\newtoks\definition@toks
\newcounter{definitioncount}
\NewEnviron{defn}[1][]{%
\@tempswafalse
\expandafter\catch@definitionlabel\BODY\label\@@nil\@nil
\if\relax\detokenize{#1}\relax
\defnINN
\else
\defnINN[#1]%
\fi
\if@tempswa
\refstepcounter{definitioncount}%
\edef\definition@label{\romannumeral\value{definitioncount}}%
\label{\definition@label}%
\fi
\BODY
\enddefnINN
\edef\@tempa{%
\noexpand\item[Definition\noexpand~\thedefnINN\noexpand~%
(page\noexpand~\noexpand\pageref{\definition@label})]%
\unexpanded\expandafter{\BODY}%
}
\global\definition@toks=\expandafter{\the\expandafter\definition@toks\@tempa}%
}
\def\catch@definitionlabel#1\label#2#3\@nil{%
\if\relax\detokenize{#3}\relax
% no \label
\@tempswatrue
\else
% \label
\def\definition@label{#2}%
\fi
}
\def\printdefinitions{%
\begin{description}\let\label\@gobble
\the\definition@toks
\end{description}
}
\makeatother
\begin{document}
\chapter{One}
\begin{defn}
A model is said to be a game if it comprises of players. \\
\end{defn}
\chapter{two}
\begin{defn}
this is chapter two
\end{defn}
\chapter{three}
\section*{three as well}
\begin{defn}
\center{this is chapter three}
\end{defn}
\chapter*{List of Definitions}
\printdefinitions
\end{document}
我进行了编辑以制作一个例子,但代码似乎与这个例子运行得很好,我想我的序言中的其他内容因此产生了冲突!
编辑:如果有人对问题的原因感兴趣,我在第二个定义中使用了 \center{},导致所有其他内容在最后的列表中居中对齐。
答案1
由于您的 MWE 编译时没有显示您的问题,因此很难排除代码故障,但您是否过度处理了这个问题? 以下内容似乎可以满足您的要求,但也许还有一些其他功能需要您采用不同的方法:
\documentclass{book}
\usepackage{amsmath, amssymb, amsthm, latexsym}
\theoremstyle{plain}
\newtheorem{thm}{Theorem}[chapter]
\theoremstyle{definition}
\newtheorem{Definition}{Definition}[chapter]
\usepackage{etoolbox}
\usepackage{environ}
\newcommand\definitionList{\relax}
\NewEnviron{defn}[1][\relax]{%
\ifx#1\relax\relax\Definition\BODY\endDefinition%
\else\Definition[#1]\BODY\endDefinition%
\fi%
%\label{definition\theDefinition}% unneccesary
\xappto\definitionList{\noexpand\item[Definition~\theDefinition\space (page \thepage)]\BODY}%
}
\newcommand\listofdefinitions{% print list of definitions
\chapter*{List of Definitions}
\begin{description}\definitionList\end{description}
}
\begin{document}
\chapter{One}
\begin{defn}
A model is said to be a game if it comprises of players.
\end{defn}
\chapter{two}
\begin{defn}
This is chapter two
\end{defn}
\chapter{three}
\section*{three as well}
\begin{defn}
This is chapter three
\end{defn}
\listofdefinitions
\end{document}
输出如下:
使用xappto
来自电子工具箱包导致了一些简化,但主要的变化是你不需要使用标签,因为定义列表正在被打印后定义已创建。如果您想将定义列表中的超链接添加回实际定义(我希望如此),那么您确实需要标签。以下修改处理超链接:
\documentclass{book}
\usepackage{amsmath, amssymb, amsthm, latexsym}
\theoremstyle{plain}
\newtheorem{thm}{Theorem}[chapter]
\theoremstyle{definition}
\newtheorem{Definition}{Definition}[chapter]
\def\Definitionautorefname{Definition}
\usepackage{etoolbox}
\usepackage{environ}
\usepackage{hyperref}
\newcommand\definitionList{\relax}
\NewEnviron{defn}[1][\relax]{%
\ifx#1\relax\relax\Definition\BODY\endDefinition%
\else\Definition[#1]\BODY\endDefinition%
\fi%
\label{definition\theDefinition}
\xappto\definitionList{%
\noexpand\item[\noexpand\autoref{definition\theDefinition} (page \thepage)]\BODY%
}%
\newcommand\listofdefinitions{% print list of definitions
\chapter*{List of Definitions}
\begin{description}\definitionList\end{description}
}
\begin{document}
\chapter{One}
\begin{defn}
A model is said to be a game if it comprises of players.
\end{defn}
\chapter{two}
\begin{defn}
This is chapter two
\end{defn}
\chapter{three}
\section*{three as well}
\begin{defn}
This is chapter three
\end{defn}
\listofdefinitions
\end{document}