我想使用封面/封底的变量 VARX
例如:头版:varx = 5cm
在后页:varx = 10cm
我的最小代码(Varx 始终 = 5cm)
\documentclass{article}
\usepackage{datatool,filecontents}
\begin{filecontents*}{test1.csv}
Acol, Bcol
Ax,Bx
Ay,By
A1,B22
A2,B44
A3,B11
\end{filecontents*}
\DTLloaddb{mydata}{test1.csv}
\expandafter\def\csname varx\endcsname{10cm}
\begin{document}
\DTLforeach{mydata}{\A=Acol,\B=Bcol}%
{%
\A \hspace{\csname varx\endcsname} \B
\newpage
}%
\end{document}
如果 page = front/back,\hspace{\csname varx\endcsname} 会如何变化?如果有宏,请使用宏
谢谢
答案1
我建议使用changepage
包来执行此操作。使用下面使用的选项strict
,它使用 LaTeX 标签来规避 TeX 排版的异步特性;1因此,至少需要两次编译:
\documentclass{article}
\usepackage{datatool}
\usepackage{filecontents}
\usepackage[strict]{changepage}
\begin{filecontents*}{test2.csv}
Acol, Bcol
Ax,Bx
Ay,By
A1,B22
A2,B44
A3,B11
\end{filecontents*}
\DTLloaddb{mydata}{test2.csv}
\newlength{\lengthForOddPages}
\newlength{\lengthForEvenPages}
\setlength{\lengthForOddPages}{5cm}
\setlength{\lengthForEvenPages}{10cm}
\newcommand*{\pageDependent}{%
\ifoddpage
\expandafter
\lengthForOddPages
\else
\expandafter
\lengthForEvenPages
\fi
}
\begin{document}
\DTLforeach*{mydata}{\A=Acol,\B=Bcol}%
{%
\A \checkoddpage\hspace{\pageDependent} \B
\newpage
}%
\end{document}
当然你也可以\pageDependent
这样定义:
\newcommand*{\pageDependent}{\ifoddpage 5cm\else 10cm\fi\relax}
以防您不想要间接引用。\relax
将停止 TeX 的 〈glue〉 读取过程。否则,在 TeX 读取 〈glue〉 的某些上下文中,2 个特定输入(例如\pageDependent plus ...
或 )\pageDependent minus ...
可能会扩展 ,...
寻找 〈glue〉 的拉伸或收缩组件,从 的扩展开始\pageDependent
(即使plus
和minus
未像这里一样明确写出,也可能发生这种情况)。
脚注
如果直接在段落内使用
\thepage
,它将扩展为 TeX 当前正在处理的页码,但因为段落可能分为几页,所以打印的页码可能与结果写入的实际页面不同。这是因为只有当 TeX 读取并处理整个段落时,才能知道换行的位置以及段落中的行数。因此,如果段落在 TeX 处理第 9 页时开始,但跨越了第 9 页和第 10 页,则简单使用\thepage
可能会在第 10 页打印数字 9。使用标签(与changepage
选项一起使用strict
)的技术可以避免此问题的发生。此外,某些命令(例如\protected@write
take care )会足够晚地展开,\thepage
以使其展开与实际页面相对应(这要归功于 how 的\write
工作原理而不是,以及定义中 的\immediate\write
特殊处理)。\thepage
\protected@write
但是,不在的参数内部;因此,即使在这个特定的例子中
\hspace
没有也不会有问题。\relax
答案2
那么像这样的事情怎么办?
\documentclass{article}
\usepackage{datatool,filecontents,lastpage,bophook}
\begin{filecontents*}{test2.csv}
Acol, Bcol
Ax,Bx
Ay,By
A1,B22
A2,B44
A3,B11
\end{filecontents*}
\DTLloaddb{mydata}{test2.csv}
\xdef\varx{10cm}
\AtBeginPage{%
\ifnum\thepage=0
\xdef\varx{10cm}
\else
\ifnum\thepage=\pageref{LastPage}
\xdef\varx{10cm}
\fi
\xdef\varx{3cm}
\fi
}
\begin{document}
\DTLforeach{mydata}{\A=Acol,\B=Bcol}%
{%
\A \hspace{\varx} \B
\newpage
}%
\end{document}
附言:你仍然可以使用你的\csname
命令代替我的命令\xdef
,但我真的不明白为什么