ОБНОВЛЯТЬ

ОБНОВЛЯТЬ

Я пытаюсь создать таблицу с двумя столбцами, в которой второй столбец представляет множество регулярных выражений со всеми символами, которые вы можете себе представить. Я пробовал использовать команду \verb|text|, но она зависает, когда есть символы '%', и если я пытаюсь экранировать их с помощью обратной косой черты, это срабатывает, но в результате сравнивается как '...\%...'. Есть ли какое-либо решение, которое может помочь мне экранировать ВСЕ символы?

Это фрагмент моего кода

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

ОБНОВЛЯТЬ

Спасибо за этот обходной путь, работает как и ожидалось! Причина, по которой я использовал tabularx вместо tabular environment, заключалась в том, что мне нужно было вручную разбивать строки в ячейке регулярного выражения; с этим решением это, похоже, все еще невозможно, но лучше, чем ничего :)

решение1

Как уже указал @DavidCarlisle в комментарии, вы можете поступить следующим образом: использовать tabularсреду вместо tabularxсреды, использовать pтип столбца для второго столбца и вычислить его ширину, используя информацию о ширине первого столбца. Такая настройка позволит использовать макрос \urlдля набора длинной строки регулярного выражения, как если бы это была строка URL.

В примере ниже использование {and/or }допустимо, поскольку, хотя эти символы встречаются в строке регулярного выражения, они встречаются в правильном порядке и сбалансированы. Если бы это было не так, т. е. если бы фигурные скобки были несбалансированными, пришлось бы использовать символ, который не встречается нигде в строке регулярного выражения; например, \url!...!and \url M...Mоба сработали бы, поскольку ни один !, ни не Mвстречается в строке регулярного выражения.

введите описание изображения здесь

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

решение2

Из-за того, что tabularxсобирает его содержимое, прямое использование \verbне сработает. Кроме того, \verbнужен один символ, которого нет в тексте, чтобы захватить. \detokenizeНужен сбалансированный текст.

Представляем миру макрос для захвата дословного текста

Идея состоит в том, чтобы захватить произвольные символы (предполагая, однако, что стандартные catcodes, естественно, в противном случае можно было бы настроить цикл для установки всех catcodes) и поместить их в макрос (невозможно с \verb). Синтаксис таков:

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

Обратите внимание, что пробелы во входных данных прямо перед словом <END OF LINE> willне быть захваченнымв макросе \foo. <SPACE>В начале обязательно и удаляется во время обработки. Пробелы, не находящиеся в самом конце буквального ввода, будут захвачены.

Код:

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

Обратите внимание, что перенос очень длинной последовательности таких детокенизированных символов является еще одной проблемой; теперь можно добавить команду \printliteral, которая будет добавлять точки останова после каждого символа.

Цитата из блока


Обновление для добавления обещанной \printliteralкоманды. См. комментарии к коду для объяснения и контекста.

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

Цитата из блока

Связанный контент