將格式應用於最外面的括號

將格式應用於最外面的括號

我有一些文字訊息,我需要將文字格式應用於所有最外面的括號,例如使它們更大和/或粗體。

從某種意義上說,我想處理文本

^(...(...(...)...)...(..)..^)...^(..(....)..^)

其中 ^( 和 ^) 具有特殊格式(基本上我想做的就是使一些數學文本(但不是數學文本)的最外面的括號突出,以便更容易閱讀)。

它看起來像

...(...(...)...)...(..)....(....)..

有什麼想法可以輕鬆做到這一點嗎?我不想在每個括號中添加 \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}

這使

範例程式碼的輸出

相關內容