newcommand для \end{tabular}\\? Обойти синтаксис и убежать
У меня есть программа для создания таблиц, которая создает таблицы для меня. Одна проблема, однако, в том, что она написана не очень хорошо.
Например, я хотел бы сделать таблицу, которая выглядит следующим образом:
\begin{tabular}{|l|lll|l|}
\cline{1-1} \cline{5-5}
id & x & y & y & sum \\ \cline{1-1} \cline{5-5}
a & 1 & 2 & 3 & 6 \\ \cline{1-1} \cline{5-5}
b & 1 & 2 & . & 3 \\ \hline
c & \multicolumn{1}{l|}{.} & \multicolumn{1}{l|}{.} & . & . \\ \hline
\end{tabular}
Иногда, однако, это добавляет к обратному слешу в конце end{tabular}
команда, которая читает end{tabular}\\
, Это приводит к ошибке в некоторых средах, таких как threeparttable
а также center
,
Я отредактировал исходный код этой программы на своем компьютере и отправил письмо автоответчику. У меня есть предстоящий проект, в котором мне нужно будет поделиться этим кодом с несколькими коллегами на нескольких компьютерах, и я не могу позволить всем найти точную команду для изменения в коде пакета. Это даже не начинает рассматривать ошибки с воспроизводимостью в целом.
Я понял, что хорошим решением для этого было бы просто прочитать команду Latex \end{tabular}\\
как end{tabular}
, Но я не могу заставить работать синтаксис, когда пытаюсь определить свою собственную команду. Может ли кто-нибудь помочь мне создать это определение? я не понимаю почему \newcommand{\end{tabular}\\}{\end{tabular}}
не работает
РЕДАКТИРОВАТЬ:
Я добавил MWE. Следующий код не будет компилироваться с использованием ShareLatex. Ошибка появляется в пустой строке после end{tabular}\\
говоря "There is no line to end here
Msgstr "Второй кусок кода, который заканчивается end{tabular}
(без обратной косой черты) компилируется нормально.
\documentclass[12pt]{article}
\usepackage[a4paper, margin = .5in]{geometry}
\usepackage{pdflscape}
\usepackage{threeparttable}
\begin{document}
\begin{table}
\caption{My test table}
\begin{center}
\begin{threeparttable}
\small
\begin{tabular}{lll}
a & b & c \\
2 & 3 & 4 \\
this & that & here
\end{tabular}\\
\begin{tablenotes}
\item
\end{tablenotes}
\end{threeparttable}
\end{center}
\end{table}
\end{document}
Это второй блок кода, который работает.
\documentclass[12pt]{article}
\usepackage[a4paper, margin = .5in]{geometry}
\usepackage{pdflscape}
\usepackage{threeparttable}
\begin{document}
\begin{table}
\caption{My test table}
\begin{center}
\begin{threeparttable}
\small
\begin{tabular}{lll}
a & b & c \\
2 & 3 & 4 \\
this & that & here
\end{tabular}
\begin{tablenotes}
\item
\end{tablenotes}
\end{threeparttable}
\end{center}
\end{table}
\end{document}
2 ответа
Вы не можете избавиться от этой ошибки, переопределив \tabular
из которых \begin{tabular}
а также \end{tabular}
это просто расширение. Это потому, что ошибочный \\
просто происходит изредка.
Вы также не должны пытаться решить эту проблему путем переопределения \\
потому что такое определение должно было бы сильно влиять на внутренности TeX.
Я думаю, что ваши лучшие варианты
- найти кого-то, чтобы исправить эту ошибку в генераторе таблиц и получить его официально выпущенным,
- создайте неофициальный патч для последней версии и раздайте его своей команде, или
- попытаться найти обходной путь для этой ошибки, такой как оптимизация исходного файла, содержащего таблицу, перед компиляцией
Вы также можете постобработать вывод с помощью небольшого скрипта, который удаляет любой трейлинг \\
после табличного.
Вы могли бы использовать LuaLaTeX и (а) настроить функцию, которая изменяет все экземпляры \end{tabular}\\
в тексте \end{tabular}
"на лету" и (б) назначить эту функцию так называемой process_input_buffer
обратный вызов, который выполняет свою работу на очень ранней стадии обработки, до того, как (La)TeX выполняет свою обычную работу.
% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{threeparttable}
\usepackage{luacode}
\begin{luacode}
function removetabularbs ( line )
return string.gsub ( line, "\\end{tabular}\\\\", "\\end{tabular}" )
end
luatexbase.add_to_callback ( "process_input_buffer", removetabularbs, "removetabularbs" )
\end{luacode}
\begin{document}
\begin{threeparttable}
\begin{tabular}{ l l l }
a & b & c \\
2 & 3 & 4 \\
this & that & here
\end{tabular}\\
\begin{tablenotes}
\item Something
\end{tablenotes}
\end{threeparttable}
\end{document}
Таким образом, вы все еще обрабатываете исходный код без изменения кода.