Mehrere Space Hacks schaffen mehr Platz

Mehrere Space Hacks schaffen mehr Platz

Dies ist eine Fortsetzung eines kürzlichen Beitrags:Erstellen eines entfernbaren Kommentarbefehls ohne zusätzlichen Platz. Ich versuche, etwas Übliches zu tun: einen Befehl zum Entfernen von Kommentaren zu erstellen, damit die an einem Dokument Mitwirkenden sich gegenseitig und sich selbst Notizen hinterlassen können, die Notizen aber vor der Produktion automatisch entfernt werden können. Das Problem ist, dass hier sehr leicht zusätzlicher Platz entsteht.

Die Lösung im oben genannten Beitrag war folgende:

\newif\ifnotes
\makeatletter
\newcommand{\note}[1]{\ifnotes{#1}\else\@bsphack\@esphack\fi}
\makeatother

Das funktioniert ganz gut, ist aber nicht perfekt. Insbesondere wird zusätzlicher Platz hinzugefügt, wenn zwei Noten hintereinander vorkommen. Betrachten Sie beispielsweise:

\notesfalse

Testing \note{X} testing testing.

Testing \note{X}\note{Y} testing testing.

Testing \note{X} \note{Y} testing testing.

\notestrue

Testing \note{X} testing testing.

Testing \note{X}\note{Y} testing testing.

Testing \note{X} \note{Y} testing testing.

Aus dem Obigen ergibt sich:

Ausgabe

Wie wir sehen können, \@bsphack\@esphackwird das richtig eliminiertmanchedes redundanten Raums und funktioniert recht gut, wenn nur eine Note übrig bleibt. Wenn jedoch zwei Noten nebeneinander erscheinen, entsteht im Ergebnis mehr Raum.

Ein Ansatz, den ich in Betracht gezogen habe, ist, dass der \noteBefehl erkennen könnte, dass er sich neben einer anderen Note befindet, und dann die Ausgabe des zusätzlichen vermeiden könnte \@bsphack\@esphack. Meine Versuche, in der Vergangenheit ähnliche Befehle zu erstellen, waren jedoch ziemlich erfolglos. Ist jemandem so etwas schon einmal begegnet? Meine Suche war ergebnislos.

Danke!

Antwort1

Ein Problem besteht darin, dass \@esphackder Wert des Registers nicht geprüft und anschließend geändert wird \lastskip.

Daher beeinflusst das \@esphackin vorhergehenden Instanzen von \notedie Art und Weise, wie \@esphack in nachfolgenden Instanzen von \notefunktioniert.

Eine Variante, \@esphackbei der etwas „vor- und zurückgesprungen“ wird, könnte hilfreich sein.

Aufrichtig

Ulrich

\documentclass{article}

\newif\ifnotes
\makeatletter
\newcommand{\note}[1]{%
  \@bsphack
%=== instead of \@esphack: ===
%  \showthe\lastskip  
  \relax
  \ifhmode
    \spacefactor\@savsf
    \ifdim\@savsk>\z@
      \nobreak
      \hskip\z@skip
% The previous action will change \lastskip, so:
      \hskip-\@savsk
      \hskip\@savsk      
% now \lastskip is almost \@savsk again.
%      \showthe\lastskip
      \ignorespaces
    \fi
  \fi
%===========================
  \ifnotes #1\fi
}
\makeatother

\begin{document}

\notesfalse

Testing\note{X}testing testing.

Testing \note{X}testing testing.

Testing\note{X} testing testing.

Testing \note{X} testing testing.

Testing\note{X}\note{Y}testing testing.

Testing\note{X}\note{Y} testing testing.

Testing\note{X} \note{Y}testing testing.

Testing\note{X} \note{Y} testing testing.

Testing \note{X} \note{Y}testing testing.

Testing \note{X} \note{Y} testing testing.

Testing \note{X}\note{Y} testing testing.

Testing \note{X}\note{Y}testing testing.

\notestrue

Testing\note{X}testing testing.

Testing \note{X}testing testing.

Testing\note{X} testing testing.

Testing \note{X} testing testing.

Testing\note{X}\note{Y}testing testing.

Testing\note{X}\note{Y} testing testing.

Testing\note{X} \note{Y}testing testing.

Testing\note{X} \note{Y} testing testing.

Testing \note{X} \note{Y}testing testing.

Testing \note{X} \note{Y} testing testing.

Testing \note{X}\note{Y} testing testing.

Testing \note{X}\note{Y}testing testing.

\end{document}

verwandte Informationen