ACTUALIZAR

ACTUALIZAR

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 tabularentorno en lugar de un tabularxentorno, use el ptipo 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 \urlmacro 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...Mambos funcionarían ya que ni !ni Maparece en la cadena de expresiones regulares.

ingrese la descripción de la imagen aquí

\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 tabularxrecoge su contenido, el uso directo de \verbno funcionaría. Además \verbnecesita un carácter que no esté en el texto para capturar. Necesita \detokenizeun 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 \printliteralcomando que agregaría puntos de interrupción después de cada carácter.

cita en bloque


Actualice para agregar el \printliteralcomando 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}

cita en bloque

información relacionada