我有一些文本信息,需要将文本格式应用于所有最外层的括号,例如使它们变大和/或加粗。
从某种意义上说,我想处理这样的文本
^(...(...(...)...)...(..)..^)...^(..(....)..^)
其中 ^( 和 ^) 具有特殊格式(基本上我想要做的就是使某些数学文本(但不是数学文本)的最外层括号脱颖而出,以便于阅读)。
它看起来像
(...(...(...)...)...(..)..)...(..(....)..)
有什么想法可以轻松做到这一点?我不想在每个括号中添加 \mathbf,因为它会使文本变得混乱。
(事实上我实际上想修改*(之前的文本并对其应用格式(仅其之前的单词)。
所以
一些文本(....)
将获得一种应用于 SomeText 和外部 () 的格式,但内部的所有内容将保留。
我想尽可能避免使文本混乱,我猜需要一些环境?
答案1
我不会乱用 catcodes,因为你永远不知道对其他包的影响,尤其是对数学的影响,而是提供一个小型解析器。作者将输入插入如下:
\[\parser SomeWords (...(\alpha...(...)...)...(\beta)..)...(..(....)..);\]
如果您愿意,您可以赋予\parser
一个更具语义的含义,它和第一个左括号之间的任何内容都会以粗体显示。如果字符串不包含数学,您可以省略\[..\]
。
我们使用 LaTeX 内核循环逐个字母解析第一个左括号和最后一个左括号之间直到分号的内容@tfor
。我们在外循环和内循环之间保持平衡并相应地进行排版。结果如下:
MWE 如下所示:
\documentclass{article}
\begin{document}
\makeatletter
\def\L{(}
\def\R{)}
%left counter
\newcounter{cnt}
\setcounter{cnt}{1}
%right counter
\newcounter{cntr}
\setcounter{cntr}{1}
%new counter balancing
\newcounter{bal}
\setcounter{bal}{0}
%define the parser
\def\parser#1(#2);{%
\textbf{#1 (}
\@tfor\next:=#2\do{%
\ifx\next\L \stepcounter{cnt}
\stepcounter{bal}
\ifnum\thebal=0 \textbf{\next}\else\normalfont\next\fi%
%
\else
\ifx\next\R \stepcounter{cntr}
\addtocounter{bal}{-1}
\ifnum\thebal=-1 \textbf{\next}\else\next\fi%
\else
\next
\fi
\fi
}%end forloop
\textbf{)}
}
\[\parser SomeWords (...(\alpha...(...)...)...(\beta)..)...(..(....)..);\]
\end{document}
答案2
也许\lgroup
/\rgroup
是外括号吗?
$$\lgroup a(b(c)) (d)\rgroup \lgroup e(fg) h\rgroup$$
\bye
对于宏,可以使用括号作为宏分隔符,并使用空格作为结束分隔符(在示例中,行更改算作空格,即结束分隔符):
\def\someFormat#1{{\it #1\/}}
\def\thingamabob#1(#2) {{\someFormat{#1}\mathsurround0pt$\lgroup$#2$\rgroup$}}
\thingamabob SomeText(blah(foo)bar) \thingamabob (bar(baz)foo(blah))
\bye
这里\mathsurround0pt
只是为了确保在数学模式设置为>0的情况下,在数学模式改变之前/之后没有添加任何空格,并且周围的组包含此命令内的该设置。
答案3
下面提供了\important[<prefix>]{<stuff>}
排版字首(粗体,文本模式)并用和包围<stuff>
以作为强调形式。或者,也可以采用环境样式的方法,由(“group” 的缩写)提供:\big(
\big)
grp
\documentclass{article}
\newcommand{\important}[2][]{\textbf{#1}\big(#2\big)}%
\newenvironment{grp}{\big(}{\big)}
\begin{document}
\[
\important[SomeText]{\ldots(\ldots(\ldots)\ldots)\ldots(\ldots)\ldots}\ldots\important{\ldots(\ldots)\ldots}
\]
\[
\textbf{SomeText}\begin{grp}\ldots(\ldots(\ldots)\ldots)\ldots(\ldots)\ldots\end{grp}\ldots\begin{grp}\ldots(\ldots)\ldots\end{grp}
\]
\end{document}
答案4
根据上述 @wh1t3 的建议,这里有一种定义\outermost
命令的方法,该命令强调第一个左括号之前的任何文本,然后强调此后每对最外层括号。如果您不想让括号在其余代码中被特殊处理,则需要将其隔离在一个块中。
强调代码可以根据需要进行更改:特别是,我在这里假设这将在文本模式下使用,因此使用\textbf
,但是\mathbf
(或者也许是穷人的粗体命令来处理括号)如果您想在数学模式下使用它,它会起作用。
这种方法的主要优点是包含括号的文本不需要额外的标记。
\documentclass{standalone} % for demonstration purposes
\makeatletter
\newcount\@nbegin % number of inner open parentheses in current block
\newcount\@nend % number of outer open parentheses in current block
\newcommand\@outermostopen{%
\@nbegin=0\@nend=0\relax%
\@beginisinner\@endisouter%
\@outermostem{(}}
\newcommand\@outermostclose{%
\@outermostem{)}%
\@beginisouter}
\newcommand\@inneropen{%
(%
\advance\@nbegin by 1\relax%
\@endisinner}
\newcommand\@innerclose{%
)%
\advance\@nend by 1
\ifnum\@nend=\@nbegin%
\@endisouter\fi%
}
\def\outermost#1({%
\catcode`(=\active
\catcode`)=\active
\@outermostem{#1}\@outermostopen%
}
{ % Commands that redefine parentheses themselves need to be defined
% in a context where () are active
\catcode`(=\active
\catcode`)=\active
\gdef\@beginisouter{%
\def({\@outermostopen}%
}
\gdef\@beginisinner{%
\def({\@inneropen}%
}
\gdef\@endisouter{%
\def){\@outermostclose}%
}
\gdef\@endisinner{%
\def){\@innerclose}%
}
}
\newcommand{\@outermostem}[1]{\textbf{\Large #1}}
% redefine for whatever emphasis method you want
\makeatother
\begin{document}
{\outermost Beginning(\dots(\dots)\dots)\dots(\dots)\dots(\dots(\dots(\dots)\dots(\dots)\dots)\dots)}
\end{document}
这使