
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:
Wie wir sehen können, \@bsphack\@esphack
wird 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 \note
Befehl 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 \@esphack
der Wert des Registers nicht geprüft und anschließend geändert wird \lastskip
.
Daher beeinflusst das \@esphack
in vorhergehenden Instanzen von \note
die Art und Weise, wie \@esphack
in nachfolgenden Instanzen von \note
funktioniert.
Eine Variante, \@esphack
bei 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}