Überarbeitungsverlauf[Zurück]
Klicke auf Einblenden/Ausblenden von Überarbeitungen 6

06 Nov '18, 19:48

Skillmon's gravatar image

Skillmon
1.2k6

# Besser als Besser: Im TeXbook wird deutlich, dass anstatt `\fontdimen2` zu ändern, eher `\spaceskip` auf einen von 0pt verschiedenen Wert setzen gesetzt werden sollte (danke Ulrike für den Hinweis darauf). Das Folgende setzt also `\spaceskip` auf den veränderten Wert (aber mit den Font eigenen Stretch und Shrink Faktoren): \documentclass[preview,border=2mm]{standalone} \newcommand\SpreadSpace[1] {% \begingroup \setbox0\hbox{$\:$ \hbox{}}% \spaceskip\wd0 plus \fontdimen3\font minus \fontdimen4\font #1% \endgroup } \newcommand\ExpandableText{This is text} \begin{document} This is text\par \SpreadSpace{This is text}\par \SpreadSpace{\ExpandableText} \end{document} (Ausgabe wie unten) ---- # Besser als das Original: Der Abstand zwischen zwei Wörtern wird in `\fontdimen2` gespeichert. Man kann diese Größe durchaus ändern: \documentclass[preview,border=2mm]{standalone} \newdimen\CisTmpDimen \newcommand\SpreadSpace[1] {% \begingroup % the group is only necessary because of the \setbox0 thingy \setbox0\hbox{$\:$ \hbox{}}% \CisTmpDimen=\fontdimen2\font % changes are made global, we have to manually revert them \fontdimen2\font=\wd0 #1% \fontdimen2\font=\CisTmpDimen \endgroup } \newcommand\ExpandableText{This is text} \begin{document} This is text\par \SpreadSpace{This is text}\par \SpreadSpace{\ExpandableText} \end{document} [![alt text][1]][1] ------ # Originalantwort: Eine primitive Lösung wäre das Ersetzen aller gewöhnlichen Leerzeichen durch `\: `, dies wäre mit Hilfe von `expl3` mit folgendem Code möglich. Das Makro kann gesternt verwendet werden, in diesem Fall wird das Argument vollständig expandiert (wie bei einem `\edef`), bevor die Ersetzung durchgeführt wird. \documentclass[preview,border=2mm]{standalone} \usepackage{xparse} \ExplSyntaxOn \tl_new:N \l_cis_tmp_tl \NewDocumentCommand \SpreadSpace { s m } { \IfBooleanTF { #1 } { \tl_set:Nx \l_cis_tmp_tl { #2 } } { \tl_set:Nn \l_cis_tmp_tl { #2 } } \tl_replace_all:Nnn \l_cis_tmp_tl { ~ } { \ensuremath { \: } ~ } \l_cis_tmp_tl } \ExplSyntaxOff \newcommand\ExpandableText{This is text} \begin{document} This is text\par \SpreadSpace{This is text}\par \SpreadSpace{\ExpandableText}\par \SpreadSpace*{\ExpandableText} \end{document} [![alt text][2]][3] [1]: https://texwelt.de/wissen/upfiles/spacespread-1_1.png [2]: https://texwelt.de/wissen/upfiles/spacespread-1.png [3]: https://texwelt.de/wissen/upfiles/spacespread-1.png
Klicke auf Einblenden/Ausblenden von Überarbeitungen 5

06 Nov '18, 14:39

Skillmon's gravatar image

Skillmon
1.2k6

# Besser als Besser: Im TeXbook wird deutlich, dass anstatt `\fontdimen2` zu ändern, eher `\spaceskip` auf einen von 0pt verschiedenen Wert setzen sollte (danke Ulrike für den Hinweis darauf). Das Folgende setzt also `\spaceskip` auf den veränderten Wert (aber mit den Font eigenen Stretch und Shrink Faktoren): \documentclass[preview,border=2mm]{standalone} \newcommand\SpreadSpace[1] {% \begingroup \setbox0\hbox{$\:$ \hbox{}}% \spaceskip\wd0 plus \fontdimen3\font minus \fontdimen4\font #1% \endgroup } \newcommand\ExpandableText{This is text} \begin{document} This is text\par \SpreadSpace{This is text}\par \SpreadSpace{\ExpandableText} \end{document} (Ausgabe wie unten) ---- # Besser als das Original: Der Abstand zwischen zwei Wörtern wird in `\fontdimen2` gespeichert. Man kann diese Größe durchaus ändern: \documentclass[preview,border=2mm]{standalone} \newdimen\CisTmpDimen \newcommand\SpreadSpace[1] {% \begingroup % the group is only necessary because of the \setbox0 thingy \setbox0\hbox{$\:$ \hbox{}}% \CisTmpDimen=\fontdimen2\font % changes are made global, we have to manually revert them \fontdimen2\font=\wd0 #1% \fontdimen2\font=\CisTmpDimen \endgroup } \newcommand\ExpandableText{This is text} \begin{document} This is text\par \SpreadSpace{This is text}\par \SpreadSpace{\ExpandableText} \end{document} [![alt text][1]][1] ------ # Originalantwort: Eine primitive Lösung wäre das Ersetzen aller gewöhnlichen Leerzeichen durch `\: `, dies wäre mit Hilfe von `expl3` mit folgendem Code möglich. Das Makro kann gesternt verwendet werden, in diesem Fall wird das Argument vollständig expandiert (wie bei einem `\edef`), bevor die Ersetzung durchgeführt wird. \documentclass[preview,border=2mm]{standalone} \usepackage{xparse} \ExplSyntaxOn \tl_new:N \l_cis_tmp_tl \NewDocumentCommand \SpreadSpace { s m } { \IfBooleanTF { #1 } { \tl_set:Nx \l_cis_tmp_tl { #2 } } { \tl_set:Nn \l_cis_tmp_tl { #2 } } \tl_replace_all:Nnn \l_cis_tmp_tl { ~ } { \ensuremath { \: } ~ } \l_cis_tmp_tl } \ExplSyntaxOff \newcommand\ExpandableText{This is text} \begin{document} This is text\par \SpreadSpace{This is text}\par \SpreadSpace{\ExpandableText}\par \SpreadSpace*{\ExpandableText} \end{document} [![alt text][2]][3] [1]: https://texwelt.de/wissen/upfiles/spacespread-1_1.png [2]: https://texwelt.de/wissen/upfiles/spacespread-1.png [3]: https://texwelt.de/wissen/upfiles/spacespread-1.png
Klicke auf Einblenden/Ausblenden von Überarbeitungen 4

05 Nov '18, 09:58

Skillmon's gravatar image

Skillmon
1.2k6

Klicke auf Einblenden/Ausblenden von Überarbeitungen 3

05 Nov '18, 02:19

Skillmon's gravatar image

Skillmon
1.2k6

Klicke auf Einblenden/Ausblenden von Überarbeitungen 2

05 Nov '18, 02:14

Skillmon's gravatar image

Skillmon
1.2k6

Klicke auf Einblenden/Ausblenden von Überarbeitungen 1

05 Nov '18, 01:59

Skillmon's gravatar image

Skillmon
1.2k6

Willkommen, erstes Mal hier? Schau mal unter FAQ!

×