Jako tytuł, jaka jest różnica między a
~
?
Nie widzę różnic po kompilacji.
MWE:
\documentclass[a4paper]{article} \usepackage[english]{babel} \usepackage[utf8]{inputenc} \usepackage{amsmath} \usepackage{graphicx} \usepackage[colorinlistoftodos]{todonotes} \title{Your Paper} \author{You} \date{\today} \begin{document} \maketitle I am cool. I~am~cool. \end{document}
Komentarze
Odpowiedź
Różnicę widać na końcu linii. Spację można złamać, a ~
to spacja niemożliwa do złamania.
\documentclass[a4paper]{article} \usepackage[english]{babel} \usepackage[utf8]{inputenc} \usepackage{amsmath} \usepackage{graphicx} \usepackage[colorinlistoftodos]{todonotes} \title{Your Paper} \author{You} \date{\today} \begin{document} \maketitle \hspace*{0.9\textwidth}I am cool. \hspace*{0.9\textwidth}I~am~cool. \end{document}
Trzy słowa I
am
i cool
są sklejone ze sobą w drugiej linii.
Odpowiedź
~
to aktywny znak , co oznacza, że jest taki sam jak makro, na przykład \mbox
itd. Jego funkcja jest opisana przez definicja, czyli
\nobreakspace{}
, więc wpisanie ~
jest równoważne wpisaniu \nobreakspace{}
.
Co robi \nobreakspace
? Oto on:
\leavevmode\nobreak\
(spacja następuje po ostatnim ukośniku odwrotnym). Tak więc akapit jest rozpoczynany lub nic nie jest wykonywane, jeśli „jesteśmy już w akapicie (\leavevmode
); następnie wydawany jest \nobreak
, co uniemożliwia jakiekolwiek łamanie wiersza w punkcie (\nobreak
), a następnie wstawiana jest normalna przestrzeń międzysłowa.
Zatem podczas pisania
no~break
będzie spacja między dwoma słowami, ale wiersz nie zostanie przerwany po no
.
Dlaczego {}
po \nobreakspace
? Jeśli w podpisie znajduje się no~break
, w pliku .aux
pojawi się rozszerzona wersja
no\nobreakspace {}break
Nawiasy klamrowe zostały wprowadzone, aby poradzić sobie z rzadkim przypadkiem, gdy potrzebna jest spacja po ~
; bez nich no~ break
napisałby
no\nobreakspace break
i po przeczytaniu .aux
, spacja zostanie zignorowana. Z nawiasami klamrowymi
no\nobreakspace {} break
zostaną zapisane, a dodatkowa spacja nie zostanie zignorowana.
Co się stanie, jeśli wpisze się no~ break
w wyjściu? Dodawane są dwie spacje, ale podział wiersza nie jest możliwy, ponieważ spacja jest wykonalnym punktem przerwania wiersza tylko wtedy, gdy nie jest poprzedzona pozycją możliwą do usunięcia; ponieważ \nobreakspace
staje się
\leavevmode\penalty 10000 \
, a kary można odrzucić jak spacje, ani \
ani następującej spacji nie można użyć do podziału wiersza.
W odwrotnym przypadku no ~break
wypisywane są dwie spacje, ale teraz możliwy jest punkt przerwania na pierwszym miejscu (i oba znikną wraz z karą w przypadku jej wykonania).
Komentarze
- Ładne wyjaśnienie. Czy mogę powiedzieć +1?
- Mówisz o
no~ break
, ale nie ono ~break
. W szczególności ten przypadek może się pojawić, gdy stosuje się ograniczenie znaku na wiersz ze zwrotem wiersza w spacji. Co się stanie w tym przypadku? - @RomainPicot Prawie to samo, otrzymujesz dwie spacje, jeśli nie nastąpi przerwa, ale przerwa jest możliwa (co nie ma miejsca w przypadku
no~ break)
- @egreg dziękuję za precyzję
;-)
- @RomainPicot Dodałem ostatnią uwagę, dzięki za podpowiedź.
Odpowiedź
To jest definicja ~
w latex.ltx
\catcode `\~=13 \def~{\nobreakspace{}}
, podczas gdy \nobreakspace
jest zdefiniowane jako
\DeclareRobustCommand{\nobreakspace}{% \leavevmode\nobreak\ }
Tak więc aktywny znak ~
jest odpowiednikiem spacji, której nie można podzielić na linie.
~
to niezniszczalna przestrzeń, gdzie jako spacja nie jest ' t niezniszczalna.:p
\the....
poleceniu wyjścia licznika.~
=\nobreakspace