我希望生成多个部分,每个部分后面跟着多行 i。这就是我使用 multido 重复自定义命令 \drawline i 次的方法。
\documentclass[12pt]{memoir}
\usepackage{tikz}
\usepackage{multido}
\newcommand{\drawline}{%
\begin{tikzpicture}%
\draw [gray] (0,0) -- (\textwidth, 0);%
\node [above right] at (0,0) {\i.};
\end{tikzpicture}%
\\%
}
\begin{document}
\section*{Section 1}
\multido{\i=1+1}{5}{\drawline}
\section*{Section 2}
\multido{\i=1+1}{4}{\drawline}
\end{document}
由此产生了如下结果:
我遇到的问题似乎与 tikzpicture 定义后的断线有关\\
。我需要在 \drawline 调用之间断线,以便线条按顺序显示而不是彼此相邻。但是,我有两个问题:
- 在最后一次调用 \drawline 之后,我得到了一个额外的不必要的空行,这意味着各部分之间有额外的空间。
- 当某一节的行数或多或少完美地填满一页时,下一节会出现在下一页,但不会出现在页面顶部。页面顶部和节标题之间有空白。
根据文档,multido 的语法如下:
\multido{*variables*}{*repetitions*}{*stuff*}
有没有办法参考重复作为变量?例如,如果希望换行符适用于所有 n,其中 n <重复? 在这种情况下,可以使用条件在除最后一种情况之外的所有情况下断行。
\\
或者,可以使用 tikzpicture 中相对于另一个 tikzpicture 的坐标吗?这样,无需在最后求助于 \drawline 即可定义。
答案1
没有必要使用multido
何时tikz
加载。只需使用\foreach
:
\documentclass[12pt]{memoir}
\usepackage{tikz}
\newcommand{\linespace}{6mm}
\newcommand{\drawlines}[1]{\tikz{\foreach \n in {1,...,#1}
{\draw[gray](0,-\n*\linespace)node[above right,black]{\n.}--(\textwidth,-\n*\linespace);}}}
\begin{document}
\section*{Section 1}
\drawlines{5}
\section*{Section 2}
\drawlines{4}
\end{document}
答案2
这是一种相当通用的方法,用于重复给定次数的事物,同时使用相应的索引。
\documentclass[12pt]{memoir}
\ExplSyntaxOn
\NewDocumentCommand{\REPEAT}{mm}
{% #1 = number of lines to print, #2 = what to repeat
\int_step_inline:nn { #1 } { #2 }
}
\ExplSyntaxOff
\newcommand{\drawline}[1]{%
\noindent\makebox[0pt][l]{#1.}%
\leaders\hrule height -2pt depth 2.2pt \hfill
\hspace*{0pt}\par
}
\newcommand{\drawlines}[1]{\REPEAT{#1}{\drawline{##1}}}
\begin{document}
\section{Title}
\drawlines{5}
\section{Title}
\drawlines{4}
\end{document}
第一个参数\REPEAT
是重复次数;第二个参数是需要执行的代码,我们可以通过 来引用索引##1
。
在特定情况下,您需要使用\REPEAT
宏\drawline
,它将当前索引设置在向右突出的零宽度框中,然后绘制一个规则,即整个文本宽度,基线以下 2pt,厚度为 0.2pt。
答案3
没有必要使用 Ti钾Z 为此,您还可以使用 LaTeX 的内置功能\rule
:
\documentclass[12pt]{memoir}
\usepackage{xcolor}
\makeatletter
\newcommand\drawline[1]
{\expandafter\drawline@\expandafter1\expandafter;\the\numexpr#1;}
\def\drawline@#1;#2;%
{%
\ifnum#1>#2
\expandafter\@gobbletwo
\fi
\@firstofone
{%
\drawline@output{#1}%
\expandafter\drawline@\the\numexpr#1+1;#2;%
}%
}
\newcommand\drawline@output[1]
{%
\par
\noindent\rlap{#1.}%
\textcolor{gray}{\rule[-0.3333em]{\linewidth}{.4pt}}%
\par
}
\makeatother
\begin{document}
\section*{Section 1}
\drawline{5}
\section*{Section 2}
\drawline{4}
\end{document}
答案4
使用 LaTeX3 版本\rule
(基于 Skillmon 的答案)
\documentclass{article}
\usepackage{xcolor}
\ExplSyntaxOn
\int_new:N \g_dl_line_count
\NewDocumentCommand{\drawlines}{ m }{
\int_set:Nn \g_dl_line_count {1}
\prg_replicate:nn {#1} {%
\par
\noindent\rlap{\int_use:N \g_dl_line_count.}%
\textcolor{gray}{\rule[-0.3333em]{\linewidth}{.4pt}}%
\par
\int_incr:N \g_dl_line_count
}
}
\ExplSyntaxOff
\begin{document}
\section*{Section 1}
\drawlines{5}
\section*{Section 2}
\drawlines{4}
\end{document}