xparse modal 命令 – 自定义宏,如 \bfseries

xparse modal 命令 – 自定义宏,如 \bfseries

我想创建一个宏命令,将所有内容放在括号内,例如任何其他字符,直到行尾或组尾{\inchar ...}。类似于自定义\bfseries命令。使用默认命令或xparse。如果可能的话,看看几个实现会很有趣。

也就是说,这样的输入应该产生相应的输出


text text \inchar() text text text text

some other text on a new line

                      

text text (text text text text)
some other text on a new line

text text \inchar|] text text text text\\
some other text on a new line

                      

text text |text text text text]
some other text on a new line

text text \inchar\{\} text text text text\par
some other text on a new line

                      

text text {text text text text}
some other text on a new line

它也应该在amsmath环境中工作

\begin{multline*}
abc\\
\inchar() def\\
ghi \inchar\{\} jkl + mno
\end{multline*}

                      

abc
                                          (def)
                                                                           ghi {jkl + mno}

答案1

第一次尝试:\autoScoped{<arg>}打开一个可以通过\\或自动结束的作用域\par,然后使用<arg>。注意这是这不是 LaTeX 的常用使用方式但这次尝试还远未完成,可能会破坏很多东西。

添加了对列表(包括 trivlist)的支持。尝试后,我发现我还无法修补amsmath软件包。抱歉。

\documentclass{article}
\usepackage{multicol}
\usepackage{xpatch}

\makeatletter
\newif\if@inscope

% start a local scope, nesting is not supported
\def\autoScoped{\@inscopetrue\ifmmode[\else\bfseries\fi}
% end a local scope
\def\end@scope@if@in{%
  \if@inscope
    \ifmmode]\else\mdseries\fi
    \@inscopefalse
  \fi}

% patch variants of \\
\@tfor\@tempa:=%
  \@normalcr % normal \\
  \@centercr % inside trivlist
\do{%
  \expandafter\xpretocmd\@tempa
    {\end@scope@if@in}
    {}{\fail}%
}
\let\\\@normalcr

% patch \par
\def\par@delimited{\end@scope@if@in\@@par}
\let\par\par@delimited
\def\@par{\let\par\par@delimited\par}
\def\@setpar#1{%
  \def\par{\end@scope@if@in#1}\def\@par{\end@scope@if@in#1}}
\makeatother


\begin{document}

\newcommand\test[1][]{
  % case 1: delimited by \\
  #1\normalfont abc def \autoScoped ghi \\ jkl \par
  % case 2: delimited by explicit \par
  #1\normalfont abc def \autoScoped ghi \par jkl \par
  % case 3: delimited by implicit \par (consecutive newlines)
  #1\normalfont abc def \autoScoped ghi

  jkl \par
}

\setlength{\columnseprule}{.4pt}
\begin{multicols}{2}  
  \subsection*{Normal case}
  \test

  \subsection*{Inside trivlist and list}
  \begin{enumerate}
    \test[\item]
  \end{enumerate}

  \begin{center}
    \test
  \end{center}

  {\raggedleft \test \par}
\end{multicols}

\end{document}

在此处输入图片描述

相关内容