
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 \parser
significado 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:
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
/ \rgroup
para os parênteses externos?
$$\lgroup a(b(c)) (d)\rgroup \lgroup e(fg) h\rgroup$$
\bye
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 \mathsurround0pt
apenas 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"):
\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 \outermost
comando 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á