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