Aplicar formatação aos parênteses mais externos

Aplicar formatação aos parênteses mais externos

Tenho algumas informações de texto nas quais preciso aplicar um formato de texto a todos os parênteses externos, como torná-los maiores e/ou em negrito.

De certa forma, quero processar texto como

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

Onde ^( e ^) têm formatos especiais (basicamente tudo o que quero fazer é destacar os parênteses externos de algum texto matemático (mas não é um texto matemático), para que seja mais fácil de ler).

Seria parecido

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

Alguma idéia para fazer isso facilmente? Não quero adicionar \mathbf a cada parêntese, pois isso desorganiza o texto.

(na verdade, eu gostaria de modificar o texto antes de *( e aplicar um formato a ele (apenas a palavra antes dele).

Então

Algum texto(....)

obteria um formato aplicado a SomeText e ao exterior (), mas tudo dentro permanecerá.

Quero evitar ao máximo desorganizar o texto e acho que é necessário algum ambiente?

Responder1

Eu não mexeria com catcodes, pois você nunca sabe as implicações para outros pacotes, especialmente para matemática, mas sim forneceria um pequeno analisador. O autor insere a entrada como:

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

Você pode dar um \parsersignificado mais semântico se quiser, qualquer coisa entre ele e o primeiro colchete de abertura será digitado em negrito. Se a string não contiver matemática, você poderá omitir o \[..\].

Analisamos o conteúdo entre o primeiro parêntese de abertura e o último até o ponto e vírgula, letra por letra, usando o loop do kernel LaTeX @tfor. Mantemos um equilíbrio entre os loops externos e internos e formatamos de acordo. Aqui está o resultado:

insira a descrição da imagem aqui

O MWE é mostrado abaixo:

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

Responder2

Talvez \lgroup/ \rgrouppara os parênteses externos?

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

insira a descrição da imagem aqui

Para a macro, você poderia usar os parênteses como delimitadores de macro e um espaço como delimitador final (no exemplo, a mudança de linha conta como um espaço, ou seja, um delimitador final):

\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

Existe \mathsurround0ptapenas para garantir que não haja nenhum espaço adicionado antes/depois das alterações no modo matemático, caso esteja definido como> 0, e o grupo ao redor está lá para conter essa configuração dentro deste comando.

Responder3

O seguinte fornece \important[<prefix>]{<stuff>}que os tiposprefixo(em negrito, modo texto) e circunda <stuff>com \big(e \big)como forma de acentuação. Alternativamente, uma abordagem de estilo de ambiente também é possível, fornecida por grp(abreviação de "grupo"):

insira a descrição da imagem aqui

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

Responder4

Seguindo a sugestão de @ wh1t3 acima, aqui está uma maneira de definir um \outermostcomando que enfatiza qualquer texto antes do primeiro parêntese de abertura e depois cada par de parênteses externos. Ele precisa ser isolado em um bloco se você não quiser que os parênteses sejam tratados especialmente para o restante do código.

O código de ênfase pode ser alterado para o que você quiser: em particular, presumi aqui que isso será usado em modo de texto, então usa \textbf, mas \mathbf(ou talvez o comando ousado de um pobre homem para lidar com os parênteses) funcionaria se você deseja usar isso no modo matemático.

A principal virtude desta abordagem é que nenhuma marcação extra é necessária no texto que contém parênteses.

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

que dá

Saída do código de exemplo

informação relacionada