2

I defined a command \tstcmd with one parameter as \@hangfrom{[#1]{ }}\nobreak. When using this command, I found that there is always an extra space between the right bracket and the text that follows.

Here is the MWE:

\documentclass{article}

\makeatletter
\def\tstcmd#1{\@hangfrom{[#1]{ }}\nobreak}
%%\DeclareRobustCommand\tstcmd[1]{\@hangfrom{[#1]{ }}\nobreak}  %%No difference
\def\hf{\@hangfrom}
\makeatother

\begin{document}

\tstcmd{1} fsdfsd fsdfsd pppwp fsdfsd fsdfsd ewrwerw hojsoisdjf
fsdfsd fsdfsd pppwp fsdfsd fsdfsd ewrwerw hojsoisdjf fsdfsd fsdfsd
pppwp fsdfsd fsdfsd ewrwerw hojsoisdjf fsdfsd

\hf{[1]{ }}\nobreak fsdfsd fsdfsd pppwp fsdfsd fsdfsd ewrwerw
hojsoisdjf fsdfsd fsdfsd pppwp fsdfsd fsdfsd ewrwerw hojsoisdjf
fsdfsd fsdfsd pppwp fsdfsd fsdfsd ewrwerw hojsoisdjf fsdfsd

\end{document}

Even if \DeclareRobustCommand is used, the extra space remains, and apparently the \nobreak in \tstcmd is not effective. Does anyone know why it is like this and how to fix it? Thanks in advance.

  • 1
    \DeclareRobustCommand has nothing to do with the problems you described. \nobreak should precede a skip (your space), not follow it. Your extraneous space comes from the fact that you write one in { } and another one after \tstcmd{1}. I suggest something like \newcommand*{\tstcmd}[1]{\@hangfrom{[#1]\nolinebreak\ }\ignorespaces} given your way of using it. – frougon Mar 21 at 7:15
  • In fact, @\hangfrom puts its argument inside a box, therefore the \nolinebreak is useless as written in my previous comment. It would be better before the \ignorespaces, I think. Thus, \newcommand*{\tstcmd}[1]{\@hangfrom{[#1] }\nolinebreak\ignorespaces}. – frougon Mar 21 at 7:27
  • There may be exceptions (e.g., if the second space is followed by \unskip), but usually, yes. Two space tokens. – frougon Mar 21 at 7:31
  • @frougon Now I see. Thanks a lot! Maybe you could post this as an answer so I can accept it. – Saad Mar 21 at 7:32
  • Why did you delete a question? It becomes difficult to follow... – frougon Mar 21 at 7:32
4

\DeclareRobustCommand has nothing to do with the problems you described. It would be useful if you wanted to put your \tstcmd calls inside the argument of a command such as \section, where stuff that is not \protect'ed gets expanded before it is written to the .toc file. \DeclareRobustCommand would make sure the command isn't expanded in such cases, but it doesn't seem very useful here.

\nobreak should precede a glue item (here, your space) when you don't want it to be a legal breakpoint, not follow it. Your extraneous space comes from the fact that you wrote one space token in { } inside the macro definition and another one at the call site right after \tstcmd{1}. I'd suggest something like:

\newcommand*{\tstcmd}[1]{%
  \@hangfrom{[#1] }\nolinebreak\ignorespaces}

given your way of using the command (i.e., with one space token afterwards that should be ignored).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.