2010-07-19 11 views
33

W this article autor omawia użycie \ @ do wstawiania poprawnych odstępów po kropkach, które nie są na końcu zdania, np. Pan tj itpPoprawny sposób definiowania makr etc ie w lateksie

Makro zasugerował

\newcommand\etc{etc\@ifnextchar.{}{.\@}} 

nie jest całkiem doskonały, gdyż w przypadku (\etc more text) produkuje (etc.more text).

Widziałem wielu autorów, którzy stworzyli własne wersje makro \etc, głównie wersje na etc.\.

Jakie makra dla \etc, \ie, \etal, \eg dają najładniejsze wyniki w większości sytuacji?

Czy jest to coś zbyt osobistego, aby można je było ogólnie rozwiązać?

+0

To był mój ulubiony SO [latex] qn w długim czasie. –

+2

Użyłem \ xspace dla moich makr \ etc-like i patrząc na to, daje mi to złe odstępy i nigdy tego nie zauważyłem. Cieszę się, że przeczytałem to pytanie. –

+0

@Ivan - Jakie są przykłady liczników? Wysłałem odpowiedź kilka dni temu i właśnie zobaczyłem ten komentarz. – Geoff

Odpowiedz

16

Wcześniej używałam makr dla "i wsp." Itp., Ale obecnie zniechęcałbym ludzi do definiowania tego rodzaju makr.

Jednym z problemów jest to, co już zaobserwowałeś: zaskakująco trudno jest uzyskać prawidłowe definicje, aby poprawnie obsługiwały wszystkie przypadki specjalne (w tym interakcje z innymi pakietami - np. Te, które ponownie definiują polecenie "\ cite" i dostosuj odstępy przed odniesieniami).

Ale co ważniejsze, nawet jeśli masz kilka makr w zależności od potrzeb i wiesz jak z nich korzystać, Twoje współautorami mogą być mylone z dokładnie, jak korzystać z makr poprawnie różne szczególne przypadki.

Dlatego zalecam unikanie makr do trywialnych rzeczy, takich jak "et al." i po prostu przeliteruj wszystko, używając standardowego znacznika Latex. W końcu większość przypadków nie wymaga specjalnej obsługi ("np." Często następuje przecinek, "et al." Często następuje po "~ \ cite", itp.), A gdy wymagana jest specjalna obsługa, wszystkie Użytkownicy lateksu powinni wiedzieć, jak używać poleceń takich jak "\" i "\ @".

+1

Zgadzam się z opinią "lekarstwo jest gorsze niż choroba", ale * wszyscy użytkownicy Latex powinni wiedzieć, jak używać poleceń takich jak "\" i "\ @" * Zgubili mnie: czy wiesz, że Tex zapewnia dodatkowe spacja po kropce w ".)"? Jeśli tak, gratulacje, jesteś elitarnym TeXnicianinem. Jeśli nie, to nie wiesz, jak poprawnie używać \ @, co doprowadziło do tego pytania. Sposób, w jaki Tex trawi twój tekst, jest bardzo podstępny, na tyle trudny, że ktoś taki jak Will Robertson może zostać złapany. –

+0

Charles: Oh, przepraszam, miałem na myśli prostsze (i dużo bardziej powszechne) przypadki, które są omówione praktycznie w każdym samouczku Latex. Jasne, zgadzam się, że przypadek ".)" Jest rzeczywiście zaskakujący i miło było nauczyć się czegoś nowego od pierwotnego pytania.:) Jednak myślę, że takie zawiłości są dobrym powodem, aby nie próbować naprawiać go za pomocą makr ... –

+1

Wygląda na to, że jest to najlepszy sposób (przynajmniej do czasu, aż LaTeX3 stanie się standardem). –

1

Wszystkie polecenia LaTeX eliminują spację za nimi. Jeśli chcesz spacji, musisz uciec:

\etc\ and more 

Jest to konieczne, ponieważ musisz być czysty, gdzie kończy się nazwa polecenia. \etcno space nie można poprawnie zinterpretować.

+0

Ale możesz wyprzedzić, aby zobaczyć, czy następna postać jest kodem 10, aby sprawdzić, czy powinna być spacja: zobacz moją odpowiedź. –

+0

Tak, możesz. Po prostu stwierdzam, jak to działa. – Svante

+1

Przykro nam, że nie możesz się doczekać: w rzeczywistości nie jest prawdą, że wszystkie polecenia eliminują przestrzeń: tylko te, które składają się z liter (tj. Kodu catcode 10 znaków). Inne polecenia zdefiniowane w normalny sposób (tj. Bez użycia '\ nazwa_użytkownika') są ciągami sterującymi o długości jednego znaku i nie pożerają przestrzeni. Właśnie dlatego warto przyjrzeć się kodeszowi następnej postaci. –

5

Techniczne wyzwanie! Możemy uniknąć problemu liter za spacjami, patrząc na catcode następnego znaku i sprawdzając, czy jest to litera; można to zrobić z expl3 makro \peek_charcode:NTF w Latex3'S (mojego pierwszego kodu expl3!):

\documentclass{article} 

\usepackage{expl3} 
\ExplSyntaxOn 
\newcommand\latinabbrev[1]{ 
    \peek_meaning:NTF . {% Same as \@ifnextchar 
    #1\@}% 
    { \peek_catcode:NTF a {% Check whether next char has same catcode as \'a, i.e., is a letter 
     #1.\@ }% 
    {#1.\@}}} 
\ExplSyntaxOff 

%Omit final dot from each def. 
\def\eg{\latinabbrev{e.g}} 
\def\etal{\latinabbrev{et al}} 
\def\etc{\latinabbrev{etc}} 
\def\ie{\latinabbrev{i.e}} 

\begin{document} 

Maybe a list, \eg, a, b, c, and d. Which is to say (\ie) a, b, \etc. Consider Knuth, \cf The TeXbook. 

\end{document} 

rada Jukka jest moim zdaniem jest dźwięk, ale: Powiedziałbym, że problem będzie działa się wokół z jego \ etc makro powinniśmy jako błąd w implementacji podwójnego odstępu przez Texa (Will Robertson powinien poprosić o jego sprawdzanie): jeśli wiesz o błędzie, możesz go obejść bezpośrednio, wstawiając \ @ w przypadkach takich jak ".)", lub możesz Masz podstępny kod, który oznacza, że ​​nie musisz myśleć w tym przypadku, ale dodałeś złożoności do składu, który nie zadziała dla Ciebie z kolejnym nieoczekiwanym usterkiem, który prawdopodobnie wprowadziłeś sam.

Postscript Poprzednia wersja poprawiona, dzięki Joseph Wright noticing a stupid error na tex.stackexchange.com.

+0

To "et al.", Skrót od "et alii". – Svante

+0

Sądzę też, że w "ie.e" powinna być mała, nierozerwalna przestrzeń. i "np.". – Svante

+0

@Svante: * et al. * - Rzeczywiście, naprawione; * Mała, nierozerwalna przestrzeń * - Nigdy o tym nie słyszałem i nie widzę tego w żadnej książce, na którą patrzyłem: czy jesteś pewien? –

3

Czy próbowałeś używać zestawu xspace?

Przykład makro:

\def\etc{etc.\@\xspace} 

Niektóre testy:

Cat, dog, \etc. And so on. \\ 
Cat, dog, \etc! And so on. \\ 
Cat, dog, \etc, and so on. \\ 
Cat (dog, \etc). And so on. \\ 

Wytwarza:

alt text


Od the documentation:

Pakiet Xspace zapewnia pojedynczy polecenie, które wygląda na to, co przychodzi po to w strumieniu polecenia i decyduje czy aby wstawić spację, aby zastąpić jeden "zjedzony" przez dekoder TeX dekoder.

+3

Musisz pożreć okres skracania w pierwszym teście (tzn. Nie "itd."), Więc musisz przetestować także następny znak. Ale masz rację, można użyć pakietu xspace zamiast jawnie testować z wyprzedzeniem dla catcode 10. –

+0

Oh. Wow, dobra uwaga. Pierwszy przykład jest nieprawidłowy. Nie znałem w jakiś sposób tej zasady gramatyki. – Geoff

+0

Tak, w twoim przykładzie 'Może lista, \ np,' lista powinna być 'Może lista, \ np.,' Ponieważ twoje makro nie ma w nim okresu kończącego. Teraz rozumiem, dlaczego nie uwzględniasz okresu końcowego w swoim makrze. Dzięki. – Geoff

3

W pakiecie CVPR za styl, jest zdefiniowana jako:

\usepackage{xspace} 

% Add a period to the end of an abbreviation unless there's one 
% already, then \xspace. 
\makeatletter 
\DeclareRobustCommand\onedot{\futurelet\@[email protected]\@onedot} 
\def\@onedot{\ifx\@[email protected]\else.\null\fi\xspace} 

\def\eg{\emph{e.g}\onedot} \def\Eg{\emph{E.g}\onedot} 
\def\ie{\emph{i.e}\onedot} \def\Ie{\emph{I.e}\onedot} 
\def\cf{\emph{c.f}\onedot} \def\Cf{\emph{C.f}\onedot} 
\def\etc{\emph{etc}\onedot} \def\vs{\emph{vs}\onedot} 
\def\wrt{w.r.t\onedot} \def\dof{d.o.f\onedot} 
\def\etal{\emph{et al}\onedot} 
\makeatother 
Powiązane problemy