
我有一些文字訊息,我需要將文字格式應用於所有最外面的括號,例如使它們更大和/或粗體。
從某種意義上說,我想處理文本
^(...(...(...)...)...(..)..^)...^(..(....)..^)
其中 ^( 和 ^) 具有特殊格式(基本上我想做的就是使一些數學文本(但不是數學文本)的最外面的括號突出,以便更容易閱讀)。
它看起來像
(...(...(...)...)...(..)..)…(..(....)..)
有什麼想法可以輕鬆做到這一點嗎?我不想在每個括號中添加 \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>
用\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}
這使