我正在使用 LaTeX 制作答题纸。我想控制列数,multicol
为此我使用了该包。为了强制分列,我还使用了\columnbreak
命令。
我面临这些问题
- 每列的第一行总是缩进不好。
- 每列第一行与第二行之间的间距不好。
- 每列下方的垂直空间太多。
- 我还想将数字
[1]
、[2]
等右对齐。
任何帮助,将不胜感激。
这是我的 MWE。
\documentclass{article}
\usepackage{multicol,pgf,pgffor,calculator,ifthen}
\setlength{\columnseprule}{0.4pt}
\newcommand{\AuxAnswerspace}[2]{
\DIVIDE{#2}{#1}{\Auxlinesx}
\FLOOR{\Auxlinesx}{\Auxlinesx}
\foreach\x in {1,...,#2} {
\MODULO{\x}{\Auxlinesx}{\Auxstartx}
\ifthenelse{\equal{\Auxstartx}{1}}{}{\vspace{.07cm}}
\noindent[\textbf{\x}] \hfill\newline
\ifthenelse{\equal{\Auxstartx}{0}}{\vfill\null\columnbreak}{\vspace{.07cm}}
}
}
\newcommand{\answerspace}[2]{
\hrule
\begin{multicols}{#1}
\noindent\AuxAnswerspace{#1}{#2}
\end{multicols}
\hrule
}
\begin{document}
\section*{Part-I}
\answerspace{3}{15}
\vspace{.3cm}
Correct = \hfill Wrong = \hfill Marks = \hspace{3cm}
\vspace{.3cm}
\hrule
\end{document}
答案1
我认为下面的代码可以解答您的所有问题。它产生:
正如已经指出的那样,没有以 结尾的行%
会导致问题。除此之外,您将\newline
s 放在每行的末尾,包括那些出现在 之前的行\columnbreak
,这会破坏行距。由于您已经加载了前列腺素包,我建议使用它进行计算。我也不喜欢ifthenelse
构造,所以我改用它,\ifnum...\fi
因为我发现它更清晰、更干净。
完整代码如下:
\documentclass{article}
\usepackage{multicol,pgf,pgffor}
\setlength{\columnseprule}{0.4pt}
\newcommand{\AuxAnswerspace}[2]{%
\pgfmathsetmacro\Auxlines{int(ceil(#2/#1))}%
\foreach \x [evaluate=\x as \line using {int(mod(\x,\Auxlines))}] in {1,...,#2} {%
\hspace*{2em}\llap{[\textbf{\x}]}%
\ifnum\line=0\vfill\columnbreak\else\newline\fi%
}%
}
\parindent=0pt
\newcommand{\answerspace}[2]{%
\hrule%
\begin{multicols}{#1}%
\AuxAnswerspace{#1}{#2}%
\end{multicols}%
\hrule%
}
\begin{document}
\section*{Part-I}
\answerspace{3}{15}
\vspace{.3cm}
Correct = \hfill Wrong = \hfill Marks = \hspace{3cm}
\vspace{.3cm}
\hrule
\end{document}
最后,为了使数字右对齐,我使用了\hspace*{2em}\llap{[\textbf{\x}]
。这将插入2em
空格宽度,然后\llap{...}
将内容写入左侧,而无需移动“光标”位置。
答案2
问题在于各种换行符会插入空格。下面%
在各行末尾插入以修复这些问题。
\documentclass{article}
\usepackage{multicol,pgf,pgffor,calculator,ifthen}
\setlength{\columnseprule}{0.4pt}
\newcommand{\AuxAnswerspace}[2]{%
\DIVIDE{#2}{#1}{\Auxlinesx}
\FLOOR{\Auxlinesx}{\Auxlinesx}
\foreach\x in {1,...,#2} {%
\MODULO{\x}{\Auxlinesx}{\Auxstartx}
\ifthenelse{\equal{\Auxstartx}{1}}{}{\vspace{.07cm}}%
\noindent[\textbf{\x}] \hfill\newline
\ifthenelse{\equal{\Auxstartx}{0}}{\vfill\null\columnbreak}{\vspace{.07cm}}%
}
}
\newcommand{\answerspace}[2]{
\hrule
\begin{multicols}{#1}%
\noindent\AuxAnswerspace{#1}{#2}
\end{multicols}
\hrule
}
\begin{document}
\section*{Part-I}
\answerspace{3}{15}
\vspace{.3cm}
Correct = \hfill Wrong = \hfill Marks = \hspace{3cm}
\vspace{.3cm}
\hrule
\end{document}