前页或后页的距离可变

前页或后页的距离可变

我想使用封面/封底的变量 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(即使plusminus未像这里一样明确写出,也可能发生这种情况)。


脚注

  1. 如果直接在段落内使用\thepage,它将扩展为 TeX 当前正在处理的页码,但因为段落可能分为几页,所以打印的页码可能与结果写入的实际页面不同。这是因为只有当 TeX 读取并处理整个段落时,才能知道换行的位置以及段落中的行数。因此,如果段落在 TeX 处理第 9 页时开始,但跨越了第 9 页和第 10 页,则简单使用\thepage可能会在第 10 页打印数字 9。使用标签(与changepage选项一起使用strict)的技术可以避免此问题的发生。此外,某些命令(例如\protected@writetake care )会足够晚地展开,\thepage以使其展开与实际页面相对应(这要归功于 how 的\write工作原理而不是,以及定义中 的\immediate\write特殊处理)。\thepage\protected@write

  2. 但是,不在的参数内部;因此,即使在这个特定的例子中\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,但我真的不明白为什么

相关内容