trivlist 列表环境 \item 命令

trivlist 列表环境 \item 命令

我的文档类使用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(和许多其他环境)使用trivlistfor 风格;所以上面的例子很麻烦,因为有一个额外的\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 ttrivlist 机制应被视为 LaTeX 中的基本显示环境机制。它用于通常不被视为列表的所有类型的显示环境,例如centerverbatim、 。除非您想重新定义所有内容,否则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} 总是成对出现,并且仅有的与其他“列表”环境的明显联系是\beginvs “命令”,通过重新定义将它们挂接起来,在整个文档中\end只使用一次重新定义,\@item但使用标志来调节实际\pl@item\boolean需要发出时的副作用\item(即生成\label命令),最后加上类似堆栈的“ \GetTokensvs \@removeelement”实现列表......似乎是最合适的技巧。

事实证明\trivlist\endtrivlistMWE 的反复试验方向确实不可能实现。

缺少的 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 ...%
                }

秒。

相关内容