
Estoy intentando crear una tabla con dos columnas, en la que la segunda representa muchas expresiones regulares con todos los caracteres que puedas imaginar. Lo intenté con \verb|text| comando, pero se atasca cuando hay símbolos '%' y, si intento escapar de ellos con una barra invertida, funciona pero se compara en el resultado como '...\%...'. ¿Existe alguna solución que pueda ayudarme a escapar de TODOS los personajes?
Este es un fragmento de mi 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}
ACTUALIZAR
Gracias por esta solución, ¡funciona como se esperaba! La razón por la que utilicé tabularx en lugar del entorno tabular fue porque tenía la necesidad de dividir líneas manualmente en la celda de Expresión regular; con esta solución parece que todavía no es posible, pero es mejor que nada :)
Respuesta1
Como ya indicó @DavidCarlisle en un comentario, podría proceder de la siguiente manera: use un tabular
entorno en lugar de un tabularx
entorno, use el p
tipo de columna para la segunda columna y calcule su ancho usando información sobre el ancho de la primera columna. Esta configuración permitiría usar la \url
macro para componer la cadena larga de expresiones regulares como si fuera una cadena URL.
En el siguiente ejemplo, se permite usar {
y/o }
porque, aunque estos caracteres aparecen en la cadena de expresiones regulares, aparecen en el orden correcto y están equilibrados. Si este no fuera el caso, es decir, si las llaves estuvieran desequilibradas, habría que utilizar un carácter que no aparezca en ninguna parte de la cadena de expresiones regulares; por ejemplo, \url!...!
y \url M...M
ambos funcionarían ya que ni !
ni M
aparece en la cadena de expresiones regulares.
\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}
Respuesta2
Debido al hecho de que tabularx
recoge su contenido, el uso directo de \verb
no funcionaría. Además \verb
necesita un carácter que no esté en el texto para capturar. Necesita \detokenize
un texto equilibrado.
Anunciando al mundo una captura macro textual
La idea es capturar caracteres arbitrarios (asumiendo, sin embargo, los códigos cat estándar naturalmente; de lo contrario, se podría configurar un bucle para configurar todos los códigos cat) y ponerlos en una macro (no es posible con \verb
). La sintaxis es:
\literalset\foo<SPACE>ARBITRARY CHARACTERS<END OF LINE>
Observe que los espacios en la entrada justo antes del
<END OF LINE>
testamentono ser capturadoen macro\foo
. El<SPACE>
al inicio es obligatorio y se elimina durante el procesamiento. Se capturarán los espacios que no estén al final de la entrada literal.
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}
Tenga en cuenta que el ajuste de una secuencia muy larga de dichos caracteres detokenizados es otro problema; ahora se podría agregar un \printliteral
comando que agregaría puntos de interrupción después de cada carácter.
Actualice para agregar el \printliteral
comando prometido. Consulte los comentarios del código para obtener explicación y 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}