
Estou tentando criar uma tabela com duas colunas, em que a segunda representa muitas expressões regulares com todos os caracteres que você possa imaginar. Eu tentei com \verb|text| comando, mas fica preso quando há símbolos '%' e, se eu tentar escapar deles com uma barra invertida, funciona, mas compara no resultado como '...\%...'. Existe alguma solução que possa me ajudar a escapar de TODOS os personagens?
Este é um trecho do meu código
\begin{table}[H]
\centering
\begin{tabularx}{\textwidth}{cX}
\toprule
$Placeholder$&$Regular~Expression$\\
\midrule
URL&(https?:\/\/)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,4}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)\\
\bottomrule
\end{tabularx}
\caption{Regular Expressions}
\label{regex}\end{table}
ATUALIZAR
Obrigado por esta solução alternativa, funciona conforme o esperado! A razão pela qual usei tabularx em vez do ambiente tabular foi porque tive a necessidade de quebrar manualmente as linhas na célula da Expressão Regular; com esta solução parece ainda não ser possível, mas melhor que nada :)
Responder1
Como @DavidCarlisle já indicou em um comentário, você poderia proceder da seguinte forma: Use um tabular
ambiente em vez de um tabularx
ambiente, use o p
tipo de coluna para a segunda coluna e calcule sua largura usando informações sobre a largura da primeira coluna. Essa configuração permitiria usar a \url
macro para compor a string regexp longa como se fosse uma string de URL.
No exemplo abaixo, usar {
e/ou }
é permitido porque mesmo que esses caracteres ocorram na string regex, eles ocorrem na ordem correta e são balanceados. Se não fosse esse o caso, ou seja, se as chaves estivessem desequilibradas, seria necessário usar um caractere que não ocorresse em nenhum lugar da string regex; por exemplo, \url!...!
e \url M...M
ambos funcionariam, pois nem !
ocorreriam M
na string regex.
\documentclass{article}
\usepackage{booktabs}
\usepackage[spaces,hyphens]{url}
\newlength\lengtha
\newlength\lengthb
% Choose longest string in column A to calculate width
\settowidth{\lengtha}{\emph{Placeholder}}
% Calculate width of column B as a residual
\setlength\lengthb{\dimexpr\textwidth-2\tabcolsep-\lengtha\relax}
\begin{document}
\begin{table}
\begin{tabular}{@{} l p{\lengthb} @{}}
\toprule
\emph{Placeholder}&\emph{Regular~Expression}\\
\midrule
URL& \url{(https?:\/\/)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,4}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)} \\
\bottomrule
\end{tabular}
\caption{Regular Expressions}
\label{regex}\end{table}
\end{document}
Responder2
Devido ao fato de tabularx
reunir seu conteúdo, o uso direto de \verb
não funcionaria. Além disso, \verb
precisa de um caractere que não esteja no texto para ser capturado. A \detokenize
necessidade de um texto equilibrado.
Anunciando ao mundo uma macro capturada literalmente
A ideia é capturar caracteres arbitrários (assumindo, no entanto, os catcodes padrão naturalmente, caso contrário, pode-se configurar um loop para definir todos os catcodes) e colocá-los em uma macro (não é possível com \verb
). A sintaxe é:
\literalset\foo<SPACE>ARBITRARY CHARACTERS<END OF LINE>
Observe que os espaços na entrada logo antes do
<END OF LINE>
testamentonão ser capturadoem macro\foo
. O<SPACE>
no início é obrigatório e é removido durante o processamento. Os espaços que não estiverem no final da entrada literal serão capturados.
Código:
\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[margin=.5cm]{geometry}
\usepackage{tabularx}
\makeatletter
% \literalset\foo<SPACE>ARBITRARY CHARACTERS<END OF LINE>
\def\literalset #1{% assumes standard \endlinechar
\begingroup
\def\x{#1}%
\catcode`\^^M 2
\let\do\@makeother
\dospecials
\afterassignment\literalset@i
\toks0=\bgroup }%
\def\literalset@i
{\expandafter\xdef\x{\expandafter\@gobble\the\toks0}\endgroup}
\makeatother
\begin{document}
% I have added a space between \/)? and (www compared to original.
\literalset\foo (https?:\/\/)? (www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,4}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)\\
Hello, all is fine here ? I hope so.
\typeout{I AM HERE: \meaning\foo}
\meaning\foo
\begin{table}[htbp]
\centering
\begin{tabularx}{\textwidth}{cX}
\hline
Placeholder&Regular Expression\\
\hline
URL&\texttt{\foo}\\
\hline
\end{tabularx}
\caption{Regular Expressions}
\label{regex}
\end{table}
\end{document}
Observe que o agrupamento de sequências muito longas de caracteres destokenizados é outro problema. Pode-se adicionar agora um \printliteral
comando que adicionaria pontos de interrupção após cada caractere.
Atualize para adicionar o \printliteral
comando prometido. Veja os comentários do código para explicação e contexto.
\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
%\usepackage[margin=.5cm]{geometry}
\usepackage{tabularx}
\makeatletter
% \literalset\foo<SPACE>ARBITRARY CHARACTERS<END OF LINE>
\def\literalset #1{% assumes standard \endlinechar
\begingroup
\def\x{#1}%
\catcode`\^^M 2
\let\do\@makeother
\dospecials
\afterassignment\literalset@i
\toks0=\bgroup }%
\def\literalset@i
{\expandafter\xdef\x{\expandafter\@gobble\the\toks0}\endgroup}
\makeatother
% TeX has no toggle to tell it to break long words (of random
% characters) automatically when reaching end of line: it goes
% to the right margin and beyond in absence of hyphens and
% spaces if confronted to a non-interrupted sequence of
% characters. And in a \texttt, breaking at hyphens is usually
% inihibited.
% Here is a very simple-minded macro which allows to print a
% \foo which has been declared by \literalset, with automatic
% breaks. More sophisticated treatment is possible (e.g. use
% of discretionaries to allow insertion of continuation
% symbols at breaks).
% We add a little stretch to avoid underfull/overfull boxes.
\makeatletter
\def\printliteral #1{\expandafter\printliteral@i#1\relax }%
\def\printliteral@i #1{\if\relax #1\else\hskip\z@ \@plus .4\p@\relax
#1\expandafter\printliteral@i \fi}
\makeatother
\begin{document}
% I have added a space between \/)? and (www compared to original.
\literalset\foo (https?:\/\/)? (www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,4}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)\\
Hello, all is fine here ? I hope so.
\typeout{I AM HERE: \meaning\foo}
\printliteral{\meaning\foo}
\begin{table}[htbp]
\centering
%\begin{tabularx}{\textwidth}{c>{\raggedright\arraybackslash}X}
\begin{tabularx}{\textwidth}{cX}
\hline
Placeholder&Regular Expression\\
\hline
URL&\texttt{\printliteral\foo}\\
\hline
\end{tabularx}
\caption{Regular Expressions}
\label{regex}
\end{table}
%\showoutput
\end{document}