![在 foreach 循环中定义的表内容中缺少插入 \endcsname](https://linux22.com/image/371226/%E5%9C%A8%20foreach%20%E5%BE%AA%E7%8E%AF%E4%B8%AD%E5%AE%9A%E4%B9%89%E7%9A%84%E8%A1%A8%E5%86%85%E5%AE%B9%E4%B8%AD%E7%BC%BA%E5%B0%91%E6%8F%92%E5%85%A5%20%5Cendcsname.png)
! Missing \endcsname inserted. \countuno l.67 }
从我所看到的有关此错误的信息来看,这是一个 tex 错误,因此很难确定其来源。希望这里不是这种情况,但我个人无法找到此文档的问题。我有一个类似的文档,只是略有不同,表格环境被子表包围,控制结构采用不同的形状。我觉得它可能与用于进行某些计算的计数器有关,但我没有发现它们有什么问题。
在我的文档中,我循环遍历主数据文件并将其排版到表格环境中,通过循环遍历数据文件,用计数器算法计算行位置,并将所有内容捆绑在 \tablecontents 宏中以传递到表格环境并展开。
\documentclass{article}
\usepackage{pgfplots, pgfplotstable}
\usepackage{filecontents}
\usepackage{indentfirst}
\usepackage{amsmath}
\usepackage{float}
\usepackage{hhline}
\usepackage{booktabs}
\usepackage[strict]{changepage}
\usepackage[position=top]{subfig}
\renewcommand\thesection{}
\makeatletter
\renewcommand\thesubsection{\@arabic\c@subsection}
\makeatother
\begin{filecontents}{data.dat}
28.1 0.7 0.9 1.2 1.4 1.5
40.0 11.2 11.7 12.0 12.2 12.9
44.7 18.2 19.3 19.7 19.8 20.4
50.9 28.0 28.9 29.4 29.6 30.1
57.0 43.2 42.2 41.6 40.7 40.4
61.5 50.2 51.0 52.1 52.6 52.7
67.0 62.8 64.5 65.5 65.6 68.5
72.2 78.3 79.2 80.7 80.8 82.7
\end{filecontents}
\pgfplotsset{compat=1.14}
\pgfplotstableread{data.dat}\Data
\begin{document}
\newcount\countuno
\newcount\countdos
\begin{table}[H]
\begin{tabular}{lll}
\toprule
$D$ & $h$ & $h/D$\\
\midrule
\gdef\tablecontents{}%
\foreach\row in {0,...,34}
{%
\countdos = \row
\countuno = \row
\divide\countuno by 5
\divide\countdos by 5
\multiply\countuno by -5
\advance\countuno by \row
\pgfplotstablegetelem{\countdos}{0}\of\Data\pgfmathsetmacro\elemtable{\pgfplotsretval}%
\ifnum\countuno=1
\xdef\tablecontents{%
\unexpanded\expandafter{\tablecontents}%
\noexpand\pgfmathprintnumber{\elemtable}%
}%
\fi
\pgfplotstablegetelem{\countdos}{\countuno}\of\Data\pgfmathsetmacro\elemtabledos{\pgfplotsretval}%
\pgfmathsetmacro\elemtabletres{\elemtabledos / \elemtable}
\xdef\tablecontents{%
\unexpanded\expandafter{\tablecontents}%
& \noexpand\pgfmathprintnumber{\elemtabledos} & \noexpand\pgfmathprintnumber{\elemtabletres}\noexpand\\
}%
\ifnum\countuno=5 \xdef\tablecontents{%
\unexpanded\expandafter{\tablecontents}%
\noexpand\midrule\noexpand\\
}%
\fi
}
\tablecontents
\bottomrule
\end{tabular}
\end{table}
\end{document}
编辑:我做了一些调整,并创建了一段类似的代码来代替上面的表格,但错误仍然存在,因此它不是来自表格环境。当我注释掉所有对指针的引用时,错误就消失了。当滚动浏览未来的错误消息时,下一个错误(发生在同一行)是“!缺少数字,视为零。”,下一个错误(也在同一行)是“!额外的 \endcsname。”
我还尝试将代码 \countuno 1 \foreach\row in {0,...,5}{\multiply\countuno\row} \the\countuno 放在表前,但它并没有触发错误,所以我不确定是否是计数器算法导致了错误。
答案1
这可能更接近您想要的。关键的变化是使用手册第 61 页中的语法,该语法指定[index]
必须在使用索引而不是名称的列规范之前。
此外,\countuno
在原始代码中从未等于 5,因此条件的这一部分从未执行过。我猜你在之前的定义中想要的是 6 而不是 5,但我不确定你到底想表达什么,所以我可能搞错了。
第一个值的位置奇怪的原因只是所有空格在第一个单元格中积累的效果,这也使其非常宽。
\begin{filecontents}{\jobname.dat}
28.1 0.7 0.9 1.2 1.4 1.5
40.0 11.2 11.7 12.0 12.2 12.9
44.7 18.2 19.3 19.7 19.8 20.4
50.9 28.0 28.9 29.4 29.6 30.1
57.0 43.2 42.2 41.6 40.7 40.4
61.5 50.2 51.0 52.1 52.6 52.7
67.0 62.8 64.5 65.5 65.6 68.5
72.2 78.3 79.2 80.7 80.8 82.7
\end{filecontents}
\documentclass{article}
\usepackage{pgfplots,pgfplotstable}
\usepackage{booktabs}
\pgfplotsset{compat=1.15}
\pgfplotstableread{\jobname.dat}\Data
\begin{document}
\newcount\countuno
\newcount\countdos
\def\tablecontents{}%
\begin{tabular}{lll}
\toprule
$D$ & $h$ & $h/D$\\
\midrule
\foreach\rowx [count=\rh] in {0,...,47}
{%
\countdos = \rowx
\countuno = \rowx
\divide\countuno by 6
\divide\countdos by 6
\multiply\countuno by -6
\advance\countuno by \rowx
\pgfplotstablegetelem{\countdos}{[index]0}\of\Data
\pgfmathsetmacro\elemtable{\pgfplotsretval}%
\ifnum\countuno=0
\ifnum\rh=1\relax\else
\xdef\tablecontents{%
\unexpanded\expandafter{\tablecontents}%
\noexpand\midrule
}%
\fi
\xdef\tablecontents{%
\unexpanded\expandafter{\tablecontents}%
\noexpand\pgfmathprintnumber{\elemtable}%
}%
\else
\pgfplotstablegetelem{\countdos}{[index]\countuno}\of\Data
\pgfmathsetmacro\elemtabledos{\pgfplotsretval}%
\pgfmathsetmacro\elemtabletres{\elemtabledos / \elemtable}%
\xdef\tablecontents{%
\unexpanded\expandafter{\tablecontents}%
& \noexpand\pgfmathprintnumber{\elemtabledos} & \noexpand\pgfmathprintnumber{\elemtabletres}\noexpand\\%
}%
\ifnum\countuno=5 \xdef\tablecontents{%
\unexpanded\expandafter{\tablecontents}%
}%
\fi
\fi
}%
\tablecontents
\bottomrule
\end{tabular}
\end{document}