AKTUALISIEREN

AKTUALISIEREN

Ich versuche, eine Tabelle mit zwei Spalten zu erstellen, wobei die zweite Spalte viele reguläre Ausdrücke mit allen erdenklichen Zeichen darstellt. Ich habe es mit dem Befehl \verb|text| versucht, aber er bleibt hängen, wenn „%“-Symbole vorhanden sind. Wenn ich versuche, sie mit einem Backslash zu maskieren, funktioniert es zwar, aber das Ergebnis wird als „...\%...“ verglichen. Gibt es eine Lösung, mit der ich ALLE Zeichen maskieren kann?

Dies ist ein Ausschnitt meines Codes

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

AKTUALISIEREN

Vielen Dank für diesen Workaround, funktioniert wie erwartet! Der Grund, warum ich tabularx statt der tabular-Umgebung verwendet habe, war, dass ich Zeilen in der Zelle mit regulären Ausdrücken manuell umbrechen musste; mit dieser Lösung scheint das immer noch nicht möglich zu sein, aber besser als nichts :)

Antwort1

Wie @DavidCarlisle bereits in einem Kommentar angedeutet hat, könnten Sie wie folgt vorgehen: Verwenden Sie eine tabularUmgebung anstelle einer tabularxUmgebung, verwenden Sie den pSpaltentyp für die zweite Spalte und berechnen Sie deren Breite anhand von Informationen über die Breite der ersten Spalte. Mit diesem Setup können Sie das Makro verwenden, \urlum die lange Regexp-Zeichenfolge so zu setzen, als wäre sie eine URL-Zeichenfolge.

Im folgenden Beispiel ist die Verwendung von {und/oder }zulässig, da diese Zeichen zwar in der regulären Ausdruckszeichenfolge vorkommen, aber in der richtigen Reihenfolge und ausgeglichen sind. Wäre dies nicht der Fall, d. h. wenn die geschweiften Klammern unausgewogen wären, müsste man ein Zeichen verwenden, das nirgends in der regulären Ausdruckszeichenfolge vorkommt. Beispielsweise würden \url!...!und \url M...Mbeide funktionieren, da weder !noch Min der regulären Ausdruckszeichenfolge vorkommen.

Bildbeschreibung hier eingeben

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

Antwort2

Da es tabularxseinen Inhalt sammelt, \verbwürde die direkte Verwendung von nicht funktionieren. Außerdem \verbmuss ein Zeichen erfasst werden, das nicht im Text enthalten ist. Das \detokenizeerfordert einen ausgewogenen Text.

Ankündigung eines Capture-Wörtlich-Makros

Die Idee ist, beliebige Zeichen zu erfassen (natürlich unter der Annahme der Standard-Catcodes, sonst könnte man eine Schleife einrichten, um alle Catcodes festzulegen) und sie in ein Makro zu packen (nicht möglich mit \verb). Die Syntax lautet :

\literalset\foo<SPACE>ARBITRARY CHARACTERS<END OF LINE>

Beachten Sie, dass die Leerzeichen in der Eingabe direkt vor dem <END OF LINE> Willennicht erfasst werdenim Makro \foo. Das <SPACE>am Anfang ist obligatorisch und wird während der Verarbeitung entfernt. Leerzeichen, die nicht ganz am Ende der Literaleingabe stehen, werden erfasst.

Code:

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

Beachten Sie, dass das Umbrechen sehr langer Sequenzen solcher detokenisierten Zeichen ein weiteres Problem darstellt. Man könnte jetzt einen \printliteralBefehl hinzufügen, der nach jedem Zeichen Haltepunkte einfügt.

Blockquote


Aktualisieren Sie, um den versprochenen Befehl hinzuzufügen \printliteral. Erklärungen und Kontext finden Sie in den Codekommentaren.

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

Blockquote

verwandte Informationen