我想定义一个简单的表格环境,将空格视为列分隔符。因此,类似的东西a b c d
应该被视为a & b & c & d
。我试过使用\StrSubstitute
,但似乎不可能欺骗它用替换空格&
。有什么办法可以实现这一点吗?
谢谢。
答案1
该方法的问题a b c d
在于,内容之间的多个空格将被解释为额外的列分隔符,即错误输入的空格字符可能被视为“额外的制表符对齐”字符
但是,这里有一个方法可以做到这一点:
该&
角色的 catcode 为4
(对齐标签)而space
catcode 有10
(空间)。
然后需要提供space
catcode 4
(以及&
另一个,比如说10
,才能在列中使用“空格”。
我在一个新的表格环境中应用了对 catcodes 的重新定义,该环境基本上复制了传统的tabular
。如果需要使用其他表格环境中的其他功能 - 请自行添加,我将其留作家庭作业 ;-)
由于这种重新定义发生在群体内部,因此不会泄露到外部。
我已经展示了这种方法和传统的表格,其中垂直线仅用于提供表格的外观并显示额外的间距。
\documentclass{article}
\newenvironment{mytabular}[2][c]{%
\catcode`\&=10
\catcode`\ =4
\begin{tabular}[#1]{#2}
}{%
\end{tabular}
}
\begin{document}
\begin{mytabular}{|*{5}{c|}}
a b c d a&word
\end{mytabular}
\vskip\baselineskip
\begin{tabular}{|*{5}{c|}}
a & b & c & d & a word
\end{tabular}
\end{document}
答案2
答案3
这是一个基于 LuaLaTeX 的解决方案。它允许单个和多种的使用空格字符(空格、制表符和换行符)来表示列分隔符。它适用于所有tabular
、tabular*
、tabularx
和tabulary
环境。
两条评论:
如果单元格包含两个或多个以空格分隔的单词,则在处理之前需要用特殊字符替换这些空格。在下面的示例中,我建议使用
#
表示“真实”空格的字符。要生成空单元格,请使用
{}
或&&
(后者没有相邻空格)。请参阅下面的应用示例。
解决方案的工作原理如下:sp2amp
设置一个名为(“space to ampersand”的缩写)的 Lua 函数。它首先检查正在处理的输入行是否在tabular
、tabular*
、tabularx
或tabulary
环境中;如果是,它将布尔变量设置ok_2_process
为“true”。(如果您需要扩展函数的范围以包括longtable
环境,请告诉我——概括条件并不困难if
。)当且仅当ok_2_process
等于“true”时,输入行中一个或多个空格字符的所有实例都将替换为&
,并且 的所有实例#
都将替换为(单个空格字符)。通过将 Lua 函数分配给
process_input_buffer
回调,它的工作在处理的早期阶段完成,前TeX 的“眼睛”——更不用说它的“嘴巴”和“胃”——开始完成它们的工作。
% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{luacode,luatexbase}
\begin{luacode}
ok_to_process = false
function sp2amp ( line )
if string.find ( line , "\\begin{tabular[%*xy]?}" ) then
ok_to_process = true
elseif string.find ( line , "\\end{tabular[%*xy]?}" ) then
ok_to_process = false
elseif ok_to_process then
line = string.gsub ( line , "%s+", "&" )
line = string.gsub ( line , "#", " " )
end
return line
end
luatexbase.add_to_callback( "process_input_buffer", sp2amp, "sp2amp")
\end{luacode}
\begin{document}
\begin{tabular}{|*{5}{l|}}
a b c
d A#complete#sentence.\\
e&&g {} i
\end{tabular}
\end{document}