
Ich möchte eine Reihe von Abschnitten erstellen, denen jeweils eine Reihe von Zeilen i folgt. So habe ich es gemacht, indem ich multido verwendet habe, um einen benutzerdefinierten Befehl \drawline i-mal zu wiederholen.
\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}
Das Ergebnis ist:
Das Problem, das ich habe, scheint mit der Zeilenumbruchfunktion nach der Tikzpicture-Definition zusammenzuhängen \\
. Ich muss Zeilen zwischen Aufrufen von \drawline umbrechen, damit die Zeilen nacheinander und nicht nebeneinander angezeigt werden. Ich habe jedoch zwei Probleme:
- Ich erhalte nach dem letzten Aufruf von \drawline eine zusätzliche, unnötige Leerzeile, was zusätzlichen Leerraum zwischen den Abschnitten bedeutet.
- Wenn die Zeilen eines Abschnitts eine Seite mehr oder weniger perfekt ausfüllen, erscheint der nächste Abschnitt auf der nächsten Seite, aber nicht am Seitenanfang. Zwischen dem Seitenanfang und dem Abschnittstitel befindet sich Leerraum.
Die Syntax für Multido lautet laut Dokumentation:
\multido{*variables*}{*repetitions*}{*stuff*}
Gibt es eine Möglichkeit, aufWiederholungenals Variable? Wenn man zum Beispiel möchte, dass der Zeilenumbruch für alle n gilt, wobei n <Wiederholungen? In diesem Fall könnte in allen Fällen außer dem letzten ein Bedingungssatz zum Zeilenumbruch verwendet werden.
Oder kann man stattdessen Koordinaten in Tikzpicture relativ zu einem anderen Tikzpicture verwenden? Auf diese Weise könnte \drawline definiert werden, ohne auf das \\
am Ende zurückgreifen zu müssen.
Antwort1
Es ist nicht notwendig, es zu verwenden, multido
wenn tikz
geladen wird. Verwenden Sie einfach \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}
Antwort2
Eine ziemlich allgemeine Methode, um Dinge eine bestimmte Anzahl von Malen zu wiederholen, wobei auch der entsprechende Index verwendet wird.
\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}
Das erste Argument \REPEAT
ist die Anzahl der Wiederholungen; das zweite Argument ist der auszuführende Code, wobei wir mit auf den Index verweisen können ##1
.
Im konkreten Fall benötigen Sie \REPEAT
ein \drawline
Makro, das den aktuellen Index in ein nach rechts vorstehendes Feld mit der Breite Null setzt und dann in der Regel die volle Textbreite, 2 pt unterhalb der Grundlinie und mit einer Dicke von 0,2 pt zeichnet.
Antwort3
Es ist nicht notwendig, Ti zu verwendenkZ hierfür können Sie auch das integrierte LaTeX-Feature verwenden \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}
Antwort4
Eine LaTeX3-Version mit \rule
(basierend auf Skillmons Antwort)
\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}