Formatierung auf äußerste Klammern anwenden

Formatierung auf äußerste Klammern anwenden

Ich habe einige Textinformationen, bei denen ich auf alle äußersten Klammern ein Textformat anwenden muss, z. B. indem ich sie größer und/oder fett mache.

In gewisser Weise möchte ich Text verarbeiten wie

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

Wobei ^( und ^) spezielle Formate haben (im Grunde möchte ich nur die äußersten Klammern eines mathematisch anmutenden Textes (der aber kein mathematischer Text ist) hervorheben, damit er leichter lesbar ist).

Es würde aussehen wie

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

Irgendwelche Ideen, wie man das einfacher machen kann? Ich möchte nicht zu jeder Klammer \mathbf hinzufügen müssen, da das den Text unübersichtlich macht.

(eigentlich möchte ich den Text direkt vor *( ändern und ein Format darauf anwenden (nur das Wort davor).

Also

Etwas Text(....)

würde ein Format erhalten, das auf SomeText und das Äußere () angewendet wird, aber alles darin bleibt.

Ich möchte eine Überfrachtung des Textes möglichst vermeiden und ich vermute, dass eine gewisse Umgebung erforderlich ist?

Antwort1

Ich würde mich nicht mit Catcodes herumschlagen, da man nie weiß, welche Auswirkungen das auf andere Pakete hat, insbesondere für Mathematik, sondern lieber einen kleinen Parser bereitstellen. Der Autor fügt die Eingabe folgendermaßen ein:

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

Sie können dem \parsereine weitere semantische Bedeutung geben, wenn Sie möchten. Alles zwischen ihm und der ersten öffnenden Klammer wird dann fett gesetzt. Wenn die Zeichenfolge keine Mathematik enthält, können Sie das weglassen \[..\].

Wir analysieren den Inhalt zwischen der ersten öffnenden Klammer und der letzten bis zum Semikolon Buchstabe für Buchstabe mithilfe der LaTeX-Kernelschleife @tfor. Wir achten auf ein Gleichgewicht zwischen den äußeren und inneren Schleifen und setzen entsprechend. Hier ist das Ergebnis:

Bildbeschreibung hier eingeben

Der MWE wird unten angezeigt:

\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}

Antwort2

Vielleicht \lgroup/ \rgroupfür die äußeren Klammern?

$$\lgroup a(b(c)) (d)\rgroup \lgroup e(fg) h\rgroup$$
\bye

Bildbeschreibung hier eingeben

Für das Makro könnten Sie die Klammern als Makro-Trennzeichen und ein Leerzeichen als End-Trennzeichen verwenden (im Beispiel zählt der Zeilenwechsel als Leerzeichen, also als End-Trennzeichen):

\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

Dies \mathsurround0ptdient nur dazu, sicherzustellen, dass vor/nach Änderungen des Mathematikmodus kein Leerzeichen hinzugefügt wird, falls dieser auf >0 gesetzt ist, und die umgebende Gruppe dient dazu, diese Einstellung in diesem Befehl aufzunehmen.

Antwort3

Im Folgenden wird festgelegt \important[<prefix>]{<stuff>}, dass SchriftsätzePräfix(fettgedruckt, Textmodus) und umgibt <stuff>mit \big(und \big)als Hervorhebungsform. Alternativ ist auch ein Ansatz im Umgebungsstil möglich, bereitgestellt durch grp(kurz für „Gruppe“):

Bildbeschreibung hier eingeben

\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}

Antwort4

Dem obigen Vorschlag von @wh1t3 folgend, gibt es hier eine Möglichkeit, einen Befehl zu definieren \outermost, der jeden Text vor der ersten öffnenden Klammer und dann jedes Paar äußerster Klammern danach hervorhebt. Er muss in einem Block isoliert werden, wenn Sie nicht möchten, dass Klammern für den Rest des Codes speziell behandelt werden.

Der Hervorhebungscode kann beliebig geändert werden: Insbesondere bin ich hier davon ausgegangen, dass dies im Textmodus verwendet wird, daher wird verwendet \textbf, aber \mathbf(oder vielleicht ein mutiger Befehl für Arme, um mit den Klammern umzugehen) würde funktionieren, wenn Sie dies im Mathematikmodus verwenden möchten.

Der Hauptvorteil dieses Ansatzes besteht darin, dass für den Text mit den Klammern keine zusätzliche Auszeichnung erforderlich ist.

\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}

was gibt

Ausgabe des Beispielcodes

verwandte Informationen