如何将代码附加到商品标签(框)?

如何将代码附加到商品标签(框)?

在结束后执行代码无参数宏观\ltx@GlobalAppendToMacro上 存在\ltx@LocalAppendToMacro命令-包裹。

对于在环境结束后执行代码\AfterEndEnvironment电子工具箱-package,并且无需 e-TeX 扩展即可使用\renewenvironment它。

但是,如何在 ? 的标签后“附加”代码\item\item有一个(可选)参数,因此\ltx@GlobalAppendToMacro无法\ltx@LocalAppendToMacro使用。 否则\end{description}就太晚了。

梅威瑟:

\documentclass{article}
\begin{document}
\begin{description}
 \item[Label\ReplaceMe{\textbf{OK}}] Text.
 \item[Label\ReplaceMe{\textbf{abc}}] Text.
 \item[Label] Text.
 \item Item without label.
\end{description}
\end{document}

\item[Label\ReplaceMe{\textbf{OK}}] Text.

应该“扩大”到

\item[Label]\textbf{OK} Text.

以及其他相应的。\item本身(或它调用的宏)如在

文件A:ltlists.dtx 日期:2002/10/28 版本v1.0s(来源2e,2011/06/27)

包含\box, \hbox,... 标签文本因此被“框起来”,我想“释放”其中的一部分。使用“框起来”时,我不想表明“标签”周围会有任何矩形线。

查看 Werner 提供的答案,使用以下代码是否足够?

\documentclass{article}
\usepackage{letltxmacro}
\makeatletter
\newcommand*{\ReplaceMe}[1]{\gdef\saved{#1}}
\ReplaceMe{}
\LetLtxMacro{\@olditem}{\@item}%
\newenvironment{desc}%
  {\renewcommand*{\@item}[1][]{% \begin{desc}
     \@olditem[##1]\saved\gdef\saved{}%
    }%
   \begin{description}}%
  {\end{description}}% \end{desc}
\makeatother

\begin{document}
\noindent Here is some text.
\begin{desc}
 \item[Label\ReplaceMe{\textbf{OK}}] Text.
 \item[Label\ReplaceMe{\textbf{abc}}] Text.
 \item[Label] Text.
 \item Item without label.
\end{desc}
Here is some more text.
\begin{description}
 \item[Label\ReplaceMe{\textbf{OK}}] Text.
 \item[Label\ReplaceMe{\textbf{abc}}] Text.
 \item[Label] Text.
 \item Item without label.
\end{description}
\end{document}

答案1

这是您可以使用的一个选项。\ReplaceMe宏被构造为使用切换(真/假布尔变量)并将内容存储在稍后可以检索的框中。此外,常规\item宏(和相关的\@item)被修改为将标签装箱(使用\fbox)并处理已保存的 内容\ReplaceMe

听取@egreg的建议,desc定义一个全新的描述环境来限制重新定义的范围\@item并使其保持本地化:

在此处输入图片描述

\documentclass{article}
\usepackage{letltxmacro}% http://ctan.org/pkg/letltxmacro
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\newsavebox{\ReplaceMeBox}% Store \item's \ReplaceMe
\newtoggle{ReplaceMe}% \ReplaceMe was used/not
\newcommand*{\ReplaceMe}[1]{%
  \global\toggletrue{ReplaceMe}% \ReplaceMe was used
  \global\sbox{\ReplaceMeBox}{#1}% Store contents in \ReplaceMeBox
}
\makeatletter
\LetLtxMacro{\@olditem}{\@item}%
\newenvironment{desc}%
  {\renewcommand*{\@item}[1][]{% \begin{desc}
   \@olditem[\fbox{##1}]\iftoggle{ReplaceMe}{\usebox{\ReplaceMeBox}\global\togglefalse{ReplaceMe}}{}}%
   \begin{description}}
  {\end{description}}% \end{desc}
\begin{document}
\noindent Here is some text.
\begin{desc}
 \item[Label\ReplaceMe{\textbf{OK}}] Text.
 \item[Label\ReplaceMe{\textbf{abc}}] Text.
 \item[Label] Text.
\end{desc}
Here is some more text.
\begin{description}
 \item[Label\ReplaceMe{\textbf{OK}}] Text.
 \item[Label\ReplaceMe{\textbf{abc}}] Text.
 \item[Label] Text.
\end{description}
\end{document}​

etoolbox提供切换机制,同时letltxmacro用作预防措施来处理跨宏的可选参数复制。在切换切换和保存框时跨越范围边界时,\global使用。

相关内容