我想创建一个宏命令,将所有内容放在括号内,例如任何其他字符,直到行尾或组尾{\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}