Il y a une très belle réponse de @egreg sur tex.stackexchange (https://tex.stackexchange.com/a/22199/36296) :
\documentclass{book}
\newcommand{\piece}{\hskip1sp\kern-1sp\hbox to .5cm{\hrulefill}}
\newcommand{\nbpiece}{\hbox to .5cm{\hrulefill}}
\makeatletter
\newcommand{\build}[2]{\leavevmode
\count@=\z@ \toks@={}%
\loop\ifnum\count@<\numexpr#1\relax
\toks@=\expandafter{\the\toks@#2}%
\advance\count@\@ne
\repeat
\the\toks@}
\makeatletter
\newcommand{\blank}[2][1]{%
\build{#1}{\nbpiece}\build{2*(#2-#1)}{\piece}\build{#1}{\nbpiece}}
\begin{document}
texte texte \blank{20} texte texte
\end{document}
![alt text][2]
Sans les lignes :
\documentclass{book}
\newcommand{\piece}{\hskip1sp\kern-1sp\hbox to .5cm{\hfill}}
\newcommand{\nbpiece}{\hbox to .5cm{\hfill}}
\makeatletter
\newcommand{\build}[2]{\leavevmode
\count@=\z@ \toks@={}%
\loop\ifnum\count@<\numexpr#1\relax
\toks@=\expandafter{\the\toks@#2}%
\advance\count@\@ne
\repeat
\the\toks@}
\makeatletter
\newcommand{\blank}[2][3]{%
\build{#1}{\nbpiece}\build{2*(#2-#1)}{\piece}\build{#1}{\nbpiece}}
\begin{document}
texte texte \blank{20} texte texte
\end{document}
![alt text][4]
---
Il y a aussi une extension:
\documentclass{book}
\usepackage{dashundergaps}
\begin{document}
texte texte \gap*[b]{texte invisible} texte texte
texte texte \gap*{texte invisible texte invisible texte invisible texte invisible texte invisible texte invisible} texte texte
\end{document}
![alt text][5]
[1]: https://texnique.fr/osqa/upfiles/Screen_Shot_2019-07-03_at_11.26.03.png
[2]: https://texnique.fr/osqa/upfiles/Screen_Shot_2019-07-03_at_11.26.03.png
[3]: https://texnique.fr/osqa/upfiles/Screen_Shot_2019-07-03_at_11.26.03.png
[4]: https://texnique.fr/osqa/upfiles/Screen_Shot_2019-07-03_at_11.27.33.png
[5]: https://texnique.fr/osqa/upfiles/Screen_Shot_2019-07-03_at_11.34.50.png