一番外側の括弧に書式を適用する

一番外側の括弧に書式を適用する

テキスト情報があり、一番外側の括弧すべてに、括弧を大きくしたり太字にするなどのテキスト書式を適用する必要があります。

ある意味、私はテキストを次のように処理したいのです

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

ここで、^( と ^) には特別な形式があります (基本的に、数学的なテキスト (ただし、数学テキストではありません) の最も外側の括弧を目立たせて読みやすくしたいだけです)。

それは次のようになります

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

これを簡単に行う方法はありますか? テキストが乱雑になるため、各括弧に \mathbf を追加したくありません。

(実際、私は *( の直前のテキストを変更し、それに書式を適用したいと思います(その前の単語のみ)。

それで

テキスト(....)

SomeText と外側の ( ) にフォーマットが適用されますが、内部のすべてはそのまま残ります。

テキストが乱雑になるのをできるだけ避けたいので、何らかの環境が必要だと思いますか?

答え1

特に数学の場合、他のパッケージへの影響がわからないため、catcodes には手を出すことはせず、代わりに小さなパーサーを提供します。著者は次のように入力を挿入します。

 \[\parser SomeWords (...(\alpha...(...)...)...(\beta)..)...(..(....)..);\]

必要に応じて、 にさらに意味的な意味を与えることができます\parser。 と最初の開き括弧の間にあるものはすべて太字で表示されます。 文字列に数式が含まれていない場合は、 を省略できます\[..\]

LaTeX カーネル ループを使用して、最初の開き括弧から最後の括弧まで、セミコロンまでの内容を 1 文字ずつ解析します@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、mathmode が >0 に設定されている場合に、mathmode の変更の前後にスペースが追加されないようにするためだけに存在し、周囲のグループは、このコマンド内にその設定を含めるために存在します。

答え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最初の開き括弧の前のテキストと、その後の最も外側の括弧のすべてのペアを強調するコマンドを定義する 1 つの方法を次に示します。括弧をコードの残りの部分で特別に処理したくない場合は、ブロック内で分離する必要があります。

強調コードは、好きなように変更できます。特に、ここではテキスト モードで使用されることを想定しているため、 を使用します\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}

これにより

サンプルコードの出力

関連情報