在环境中使用\newcommand

2021-02-28 18:14

A命令可以用作环境例如,macro\newcommand{\rev}[2][blue]{{\color{1}{2}}只是给它的参数上色。为什么相应的环境不给整个内容上色?\begin{document}black%正确\

解答动态

  • \begin{rev}[red]%只有第一个字母是红色的\end{rev} 是或多或少的s
    \begingroup\rev[red]是红色的\relax\endgroup ,它相当于to
    \begingroup\rev[red]{i}%n red\relax\endgroup ,由tex宏参数的内置解析规则决定。
    如果要定义环境充当宏参数,请使用\NewDocumentEnvironment和b参数。这要求xparse包使用旧版本的latex fromats,但它内置于当前版本中。
    当然,对于\color的特定示例,不需要任何参数,只需使用\color{red},颜色更改的范围将在环境结束时结束。

    • 通过检查\@currenvir,可以检查宏是用作环境还是用作普通命令。下面使用它来调用\color(它将为环境的整个内容着色)或\textcolor(它将只为强制参数着色)。
      \documentclass[]{article}\usepackage[]{color}\makeatletter\newcommand\rev[1][blue]{%\begingroup\def\tmp{rev}%\expandafter\endgroup\ifx\tmp\@currenvir\expandafter\color\else\expandafter\textcolor\fi{1}%}\makeatother\begin{document}black%正确\rev{in blue}\rev[red]{in red}%correct black%正确\begin{rev}in blue\end{rev}%只有第一个字母是蓝色\begin{rev}[red]%只有第一个字母是红色%\end{rev}black再次%black再次\end{document} 请注意,这不是万无一失的。像\begin{rev}abc\rev[red]{def}ghi\end{rev}这样的用法将导致abc为蓝色,而defghi为红色。
      检查rev是否用作环境的更好方法是使用LaTeX的hook机制来设置一个布尔值,该布尔值指示当前rev是一个环境(并让环境版本将布尔值设置回false)。这也适用于\begin{rev}abc\rev[red]{def}ghi\end{rev}.
      \documentclass[]{article}\usepackage[]{color}\makeatletter\newif等情况\ifrev@inenv公司\AddToHook{env/rev/begin}{\修订@inenvtrue}\newcommand\rev[1][蓝色]{%\ifrev@inenv公司\修订@inenvfalse\expandafter\color\else\expandafter\textcolor\fi{1}%}\makeatother\begin{document}black%正确\rev{in blue}\rev[red]{in red}%correct black%正确\begin{rev}in blue\end{rev}%only first letter is blue\begin{rev}[red]%only first letter is red in red\rev[green]{test}ed%\end{rev rev}black again%black again\end{document} (如果您失败)因为\AddToHook不可用,这是相当新的,所以可以使用\usepackage{etoolbox}和\AtBeginEnvironment{rev}{\修订@inenvtrue}相反)

      • End

      免责声明:

      本页内容仅代表作者本人意见,若因此产生任何纠纷由作者本人负责,概与琴岛网公司无关。本页内容仅供参考,请您根据自身实际情况谨慎操作。尤其涉及您或第三方利益等事项,请咨询专业人士处理。