Drawing grid lines to show vertical position of text [closed]

I have text where I want to adjust the space above the first line. I want to overlay grid lines to show where the vertical position of the text is.

The MWE below with the following line commented is the standard output. The red horizontal lines are integer multiples of \baselineskip from the top.

%\def\IncludeDesiredTopSkip{}


However, if I uncomment this line (which applies the \DesiredTopSkip, which is set to 0pt here), I obtain the following:

\def\IncludeDesiredTopSkip{}


Note that the baseline now is exactly on the line.

Question:

What am I missing that would explain this discrepancy in the two cases and how do I get both cases to properly display the baseline?

Note:

• In case anyone is curious as to why I want to do this: These lines are then used to compute the \parshape parameters based on where these lines intersect the particular shape.

Code:

%\def\IncludeDesiredTopSkip{}
\documentclass{article}
\usepackage{showframe}
\usepackage{tikz}

\usepackage[paperwidth=7.0cm]{geometry}

\newcommand*{\DesiredTopSkip}{0pt}

\newcommand*{\ShowTextGuideLines}[1]{%
\begin{tikzpicture}[remember picture, overlay]
\coordinate (X) at ([
xshift=1.0in+\hoffset+\oddsidemargin,
]current page.north west);

\node [draw=red, fill=yellow] at (X) {X};%% DEBUGGING: Ensure (X) is the correct spot.

\foreach \X in {1, ..., #1} {%
\draw [thin, red] ([yshift=-\X\baselineskip-\DesiredTopSkip]X) -- ++ (\hsize,0);
}%
\end{tikzpicture}%
}%

\begin{document}
\ifdefined\IncludeDesiredTopSkip
\hbox{}\kern-\topskip%
\vspace*{\DesiredTopSkip}%
\fi
First line. abcdefghij
\par
Second line. abcdefghij
\ShowTextGuideLines{3}
\end{document}


closed as off-topic by Peter Grill, Andrew Swann, Stefan Pinnow, Sebastiano, dexteritasDec 4 '18 at 8:55

• This question does not fall within the scope of TeX, LaTeX or related typesetting systems as defined in the help center.
If this question can be reworded to fit the rules in the help center, please edit the question.

• But you already know that the problem is topskip: The first line is not at a distance of \baselineskip (12pt) from the x but of \topskip (10pt if there is nothing large in the line). – Ulrike Fischer Nov 21 '18 at 8:39
• @UlrikeFischer: I thought that the \kern-\topskip was eliminating that as suggested at Why does \vspace*{0pt} add vertical space?. But of course, having that within the \ifdefined was the problem!! Thanks. – Peter Grill Nov 21 '18 at 16:38
• I'm voting to close this question as off-topic because the problem was due to a typo. The kern should have been before the \ifdefined, not after. – Peter Grill Dec 4 '18 at 7:37

This answer does not really address the question you ask explicitly, but I think it does accomplish what you are trying to do.

The lineno package generates line numbers and places them in the margin. I'm (ab)using this package by telling it to print red horizontal rules instead of numbers, which has the desired effect.

\documentclass{article}

\usepackage{lineno}    %% <- package for numbering lines
%\linenumbers          %% <- turns on line "numbering" globally

\usepackage{xcolor}    %% <- colour support

\newcommand*{\redline}{\color{red}\rule[-.4pt]{\textwidth}{.4pt}}
%% ^^ the optional argument puts the rule just /below/ the baseline.
%% ^^ to centre it on the baseline, change it to -.2pt.
%% ^^ remove the optional argument to place it on top of the baseline
\setmakelinenumbers\redline %% <- draw a horizontal rule instead of numbers

\usepackage{blindtext} %% <- for \blindtext

\begin{document}

\blindtext[1]

\linenumbers

\blindtext[1]

\nolinenumbers

\blindtext[1]

\end{document}


Note that instead of \linenumbers ... \nolinenumbers you can also use \begin{linenumbers}...\end{linenumbers} if you prefer this syntax.

• Nice hack. I need the lines to be drawn in tikz so that I can compute intersections. – Peter Grill Nov 21 '18 at 16:40
• Ah, I see. Do you plan to use this to have your text flow around an image? That's a pretty neat idea. – Circumscribe Nov 21 '18 at 18:38
• At the moment, I am using this to determine the \parshape parameters so that the text takes on a particular shape -- based on the output display. But, in the future I could use this to adjust the \parshape to flow around an image as well. – Peter Grill Nov 21 '18 at 19:00
• My answer probably won't be helpful then. To use Tikz you can of course instead define \newcommand*{\redline}{\tikz[baseline] \draw[thin,red] (0,0) -- (\textwidth,0);}, but I suspect that you'll want to compute these intersections and call \parshape before rendering any actual text. – Circumscribe Nov 21 '18 at 19:50