
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 tabular
Umgebung anstelle einer tabularx
Umgebung, verwenden Sie den p
Spaltentyp 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, \url
um 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...M
beide funktionieren, da weder !
noch M
in der regulären Ausdruckszeichenfolge vorkommen.
\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 tabularx
seinen Inhalt sammelt, \verb
würde die direkte Verwendung von nicht funktionieren. Außerdem \verb
muss ein Zeichen erfasst werden, das nicht im Text enthalten ist. Das \detokenize
erfordert 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 \printliteral
Befehl hinzufügen, der nach jedem Zeichen Haltepunkte einfügt.
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}