end {tabular} \的新命令?绕过语法和逃避

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了 end {tabular} \的新命令?绕过语法和逃避相关的知识,希望对你有一定的参考价值。

我有一个制表程序,可以为我创建表格。然而,一个问题是它编写得不是很好。

例如,我希望它创建一个如下所示的表:

egin{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}。这会在某些环境中引发错误,例如threeparttablecenter

我已经在自己的机器上编辑了这个程序的源代码,并通过电子邮件发送了一个没有响应的维护者。我有一个即将到来的项目,我将需要与多台计算机上的多个同事共享此代码,我不能让每个人都找到更改包的代码的确切命令。这通常不会开始考虑具有可再现性的错误。

我意识到这个问题的好处就是让Latex读取命令end{tabular}作为end{tabular}。但是当我尝试定义自己的命令时,我无法使语法工作。有人可以帮我创建这个定义吗?我不明白为什么 ewcommand{end{tabular}}{end{tabular}}不起作用。

编辑:

我添加了一个MWE。以下代码不会使用ShareLatex进行编译。在end{tabular}说“There is no line to end here”之后,空白行中弹出一个错误。以end{tabular}(没有反斜杠)结尾的第二块代码编译得很好。

documentclass[12pt]{article}
usepackage[a4paper, margin = .5in]{geometry}
usepackage{pdflscape}
usepackage{threeparttable}
egin{document} 




egin{table}
caption{My test table}
egin{center}
egin{threeparttable}
small
egin{tabular}{lll}
a    & b    & c    
2    & 3    & 4    
this & that & here
end{tabular}

egin{tablenotes}
item 
end{tablenotes}
end{threeparttable}
end{center}
end{table}

end{document} 

这是第二个代码块,即运行的代码块。

documentclass[12pt]{article}
usepackage[a4paper, margin = .5in]{geometry}
usepackage{pdflscape}
usepackage{threeparttable}
egin{document} 




egin{table}
caption{My test table}
egin{center}
egin{threeparttable}
small
egin{tabular}{lll}
a    & b    & c    
2    & 3    & 4    
this & that & here
end{tabular}

egin{tablenotes}
item 
end{tablenotes}
end{threeparttable}
end{center}
end{table}

end{document}
答案

你不能通过重新定义 abular来摆脱这个错误,其中egin{tabular}end{tabular}只是一个扩展。这是因为偶尔出现错误的

你也不应该试图通过重新定义来解决这个问题,因为这样的定义必须在TeX内部进行大量的研究。

我认为你最好的选择是

  • 找人修理表生成器中的这个bug并正式发布,
  • 为最新版本创建一个非官方的补丁,并将其分发给您的团队,或
  • 尝试找到该错误的解决方法,例如在编译之前优化包含该表的源文件

您还可以使用一个小脚本对输出进行后处理,该脚本在表格后删除任何尾随的

另一答案

您可以使用LuaLaTeX和(a)设置一个函数,将文本中end{tabular}的所有实例“动态”更改为end{tabular},并且(b)将此函数分配给所谓的process_input_buffer回调,该函数在非常好的情况下工作处理的早期阶段,之前(La)TeX执行其任何常规工作。

enter image description here

% !TEX TS-program = lualatex
documentclass{article}

usepackage{threeparttable}

usepackage{luacode}
egin{luacode}
function removetabularbs ( line )
    return string.gsub ( line, "end{tabular}\", "end{tabular}" )
end
luatexbase.add_to_callback ( "process_input_buffer", removetabularbs, "removetabularbs" )
end{luacode}

egin{document} 

egin{threeparttable}
  egin{tabular}{ l l l }
    a    & b    & c    
    2    & 3    & 4    
    this & that & here
  end{tabular}
  egin{tablenotes}
    item Something
  end{tablenotes}
end{threeparttable}

end{document}

这样,您仍然可以在不更改代码的情况下处理源代码。

以上是关于 end {tabular} \的新命令?绕过语法和逃避的主要内容,如果未能解决你的问题,请参考以下文章

Latex使用记录

latex 用tabular创建的表格如何加一个标题

Latex 表格内公式换行方法

Letax表格内单元格换行

linux读文件命令绕过姿势

命令执行漏洞,绕过过滤姿势