¿Cuál es la mejor manera de dibujar un número arbitrario de líneas en LaTeX?

¿Cuál es la mejor manera de dibujar un número arbitrario de líneas en LaTeX?

Deseo producir varias secciones, cada una seguida de varias líneas i. Así es como lo hice usando multido para repetir un comando personalizado \drawline i veces.

\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}

Lo que produce esto:

ingrese la descripción de la imagen aquí

El problema que tengo parece estar relacionado con la línea de ruptura \\que sigue a la definición de tikzpicture. Necesito dividir líneas entre llamadas de \drawline para que las líneas aparezcan en secuencia y no una al lado de la otra. Sin embargo, tengo dos problemas:

  1. Recibo una línea vacía adicional innecesaria después de la última llamada de \drawline, lo que significa espacio adicional entre secciones.
  2. Cuando las líneas de una sección llenan una página más o menos perfectamente, la siguiente sección aparece en la página siguiente, pero no en la parte superior de la página. Hay un espacio en blanco entre la parte superior de la página y el título de la sección.

La sintaxis para multido es esta según la documentación:

\multido{*variables*}{*repetitions*}{*stuff*}

¿Hay alguna manera de hacer referencia?repeticionescomo variable? Por ejemplo, si uno quisiera que el salto de línea se aplicara a todos los n donde n <repeticiones? En ese caso, se podría utilizar un condicional para romper la línea en todos los casos excepto en el último.

¿O se pueden usar coordenadas en tikzpicture en relación con otra tikzpicture? De esta manera se podría definir \drawline sin recurrir al \\final.

Respuesta1

No es necesario utilizarlo multidocuando tikzestá cargado. Solo usa \foreach:

ingrese la descripción de la imagen aquí

\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}

Respuesta2

Un método bastante general para repetir cosas un número determinado de veces, utilizando también el índice correspondiente.

\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}

El primer argumento \REPEATes el número de repeticiones; el segundo argumento es el código a ejecutar, donde podemos hacer referencia al índice mediante ##1.

En el caso particular que desee , \REPEATla \drawlinemacro establece el índice actual en un cuadro de ancho cero que sobresale hacia la derecha y luego dibuja una regla con el ancho completo del texto, 2 puntos por debajo de la línea base y con un grosor de 0,2 puntos.

ingrese la descripción de la imagen aquí

Respuesta3

No es necesario utilizar TikZ para esto, también puedes usar el integrado de 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}

ingrese la descripción de la imagen aquí

Respuesta4

Una versión de LaTeX3 que usa \rule(según la respuesta de 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}

ingrese la descripción de la imagen aquí

información relacionada