Was ist der beste Weg, um in LaTeX eine beliebige Anzahl von Linien zu zeichnen?

Was ist der beste Weg, um in LaTeX eine beliebige Anzahl von Linien zu zeichnen?

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:

Bildbeschreibung hier eingeben

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:

  1. Ich erhalte nach dem letzten Aufruf von \drawline eine zusätzliche, unnötige Leerzeile, was zusätzlichen Leerraum zwischen den Abschnitten bedeutet.
  2. 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, multidowenn tikzgeladen wird. Verwenden Sie einfach \foreach:

Bildbeschreibung hier eingeben

\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 \REPEATist 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 \REPEATein \drawlineMakro, 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.

Bildbeschreibung hier eingeben

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}

Bildbeschreibung hier eingeben

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}

Bildbeschreibung hier eingeben

verwandte Informationen