我的文档类使用paralist
并重新定义\begin{enumerate}[(a)][abc]
等……环境\label
为每个发出\item
,给出第二个选项(例如\abc{a}
),该选项成为发出 1 个参数的宏\ref
。为此和\@item
都是\pl@item
“超载“。
但是,存在一个问题,例如ntheorem
嵌套在里面的环境enumerate
:
\begin{enumerate}[(a)][abc] % \ref{...} is the body of "\gdef\abc" in refined
\item one
\begin{theorem}[second]
... and so it follows.
\end{theorem}
\end{enumerate}
As in the point \abc*{1} above... % starred wraps around parentheses
我发现ntheorem
(和许多其他环境)使用trivlist
for 风格;所以上面的例子很麻烦,因为有一个额外的\item
发行,而没有\@listdepth
增加。
我实际上必须在和之间切换\let\@item\old@item
,并\let@item\new@item
相应地使用我重新定义的\begin|\end{enumerate}
,因为从“ new
”中,我还\label
为每个\item
发出的命令生成命令。
\let\old@item\@item
\gdef\@item[#1]{\old@item[#1] ...}
\let\new@item\@item
\let\old@pl@item\pl@item
\def\pl@item[#1]{\old@pl@item[#1] ...}
\let\new@pl@item\pl@item
但\trivlist
由于ntheorem
“虚假的随之\item
而来。\trivlist
下一次尝试是重新定义\@trivlist
(也\endtrivlist
),
\def\@trivlist{\if@newlist ... \fi}
其中的点\@trivlist
跟踪是否
\def\endtrivlist{\if@newlist ... \fi}
中的点\endtrivlist
应该恢复或和old
(重新)定义。new
\@item
\pl@item
但是,从来没有\@newlist
条件为真的情况,并且\trivlist
在各处被广泛使用:因此,我无法辨别列表环境(枚举也是如此)的情况,来自...... \everypar
?
最初,我的意图是拦截\@thm
和\@endtheorem
,但我尝试扩大嵌套在重新定义的环境的可能性\begin{enumerate}
,这就是我遇到的方式\trivlist
。
问题是\@trivlist
多次发生未配对通过\endtrivlist
,这使我的任务变得不可能(因为我采用了推送/弹出技术)。尝试使用\if@newlist
,据说暗示涉及一个列表(始终成对),代码被跳过,标志是false
。这还不够,\@trivlist
还测试了标志\if@inlabel
,与 有点关系后 \item
,而我必须照顾old/new
技巧前 \item
。
感谢任何帮助,谢谢。
答案1
\endtrivlist
应该与 配对\trivlist
(而不是\@trivlist
),尽管名称包括字母,但l i s t
trivlist 机制应被视为 LaTeX 中的基本显示环境机制。它用于通常不被视为列表的所有类型的显示环境,例如center
、verbatim
、 。除非您想重新定义所有内容,否则tabbing
您真的不想弄乱它。\trivlist
答案2
根据您提供的可能的 MWE 片段,我认为以下内容可能符合您的要求。我没有重新定义 LaTeX 命令,而是创建了一个新环境myenum
和一个伪 \item
我使用 来调用它\myitem
。这样就不会与依赖 LaTeX 定义的其他定义发生冲突。
我使用xparse
两个可选参数(因为您的代码似乎表明这就是您想要的)及其默认行为来创建一个环境。但是,如果您省略第二个参数,然后省略两个参数,LaTeX 将无法接受多个定义的标签。这里似乎有两个合理的选择(1)更改参数的顺序(2)强制其中一个为强制参数。
您似乎还希望您的第二个参数定义一个命令来调用特定的引用和一个已加星标版本在引用周围应用括号。以下是执行此操作的 MWE,同时使第二个参数成为必需的:
\documentclass{article}
\pagestyle{empty}
\usepackage{xparse}
\usepackage{paralist}
\usepackage{amsthm}
\newtheorem{theorem}{theorem}
%%
\makeatletter
%% create a command to assign an enum-based prefix for each label
\newcommand{\my@label@prefix}{unused}
%% allows a starred version for the reference to have parentheses.
\newcommand{\my@ref}[2]{\ref{#1:#2}}
\newcommand{\my@@ref}[2]{(\my@ref{#1}{#2})}
\NewDocumentEnvironment{myenum}{ O{(a)} m }
{\renewcommand{\my@label@prefix}{#2}%
%% check whether second argument corresponds to pre-existing command!
\expandafter\@ifdefinable\csname #2\endcsname%
{\global\@namedef{#2}{\@ifstar{\my@@ref{#2}}{\my@ref{#2}}}}%
\begin{enumerate}[#1]}
{\end{enumerate}}
%% This next line uses paralist's internal
%% `\pl@the` to pass the correct label mark.
\newcommand{\myitem}{\item\label{\my@label@prefix:\pl@the}}
%% \newcommand{\myitem}{\item\label{\my@label@prefix:\alph{enumi}}}
\makeatother
\begin{document}
\noindent%
First:
\begin{myenum}[(a)]{abc}
\myitem one
\begin{theorem}\label{thm:first}
... and so it follows.
\end{theorem}
\myitem two
\end{myenum}
Second (\abc{a}):
\begin{myenum}[(A)]{xyz}
\myitem one
\begin{theorem}\label{thm:second}
... and so it follows.
\end{theorem}
\myitem two
\end{myenum}
Third:
\begin{myenum}[(i)]{getit}
\myitem one
\myitem two
\myitem three
\myitem four
\myitem five
\end{myenum}
\textbf{From first:} As in the point \ref{abc:a} and \abc{b} above...
\textbf{From second:} As in the point \ref{xyz:A} and \xyz*{B} above...
\textbf{From third:} As in the point \getit*{iv} and \getit{iii} above...
\textbf{Theorems:} The first theorem is \ref{thm:first} and the second is \ref{thm:second}
\end{document}
以依赖于特定顺序的方式定义标签似乎与 LaTeX 有点相反。但是,这似乎也是你想要的,我可以想象到这种情况可能是可取的(只是不多)。
答案3
由于\begin{enumerate}
vs\end{enumerate}
总是成对出现,并且仅有的与其他“列表”环境的明显联系是\begin
vs “命令”,通过重新定义将它们挂接起来,在整个文档中\end
只使用一次重新定义,\@item
但使用标志来调节实际\pl@item
\boolean
需要发出时的副作用\item
(即生成\label
命令),最后加上类似堆栈的“ \GetTokens
vs \@removeelement
”实现列表......似乎是最合适的技巧。
事实证明\trivlist
,\endtrivlist
MWE 的反复试验方向确实不可能实现。
缺少的 MWE 会花费太多“脱离上下文”的努力;相反,我因“不平衡”的尝试而失败,例如基于第一次\item
出现的情况(按照来自的想法)将“push”与“pop”\if@newlist
配对。\endtrivlist
\let\my@begin\begin
\def\begin{%\my@push{either true or false}{into the stack} depending on flag
%set flag false
\my@begin}
\let\my@end\end
\def\begin{%\my@pop{into \my@temp}{from the stack} and set flag to \my@temp
\my@end}
%\let\my@enum\---macro missing---
%redefined \begin{enumerate}: invoke \my@enum; set flag true; ...
\let\my@item\@item
\gdef\@item[#1]{\my@item[#1]%
%trigger generate \label only if flag and ...%
}
\let\my@pl@item\pl@item
\def\pl@item[#1]{\my@pl@item[#1]%
%trigger generate \label only if flag and ...%
}
秒。