%^^A* legal notices % \iffalse % % This program is part of the Frankenstein bundle for LaTeX. % % Copyright 1995-2001 Matt Swift . % % This file contains both the code and documentation for the % lips LaTeX package. It will work ONLY if it is placed in a % proper directory. Files called README, INSTALL, lips.tex % and lips.ins should have also been distributed to you % with this file. See them for more information on how to typeset % the documentation with LaTeX and how to generate a version of this % file that will work faster than this one. % % This program is free software; you may redistribute it and/or % modify it under the conditions of the LaTeX Project Public % License, either version 1.2 or (at your option) any later version. % The latest version of this license is in % http://www.latex-project.org/lppl.txt, and version 1.2 or later is % part of all distributions of LaTeX version 1999/12/01 or later. % % This program is distributed in the hope that it will be useful, % but without any warranty; without even the implied warranty of % merchantability or fitness for a particular purpose. See the % LaTeX Project Public License for more details. % % \fi % %^^A* checks % %^^A NOTE: The character table, with two %'s, will get written to all files. %% \CharacterTable %% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z %% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z %% Digits \0\1\2\3\4\5\6\7\8\9 %% Exclamation \! Double quote \" Hash (number) \# %% Dollar \$ Percent \% Ampersand \& %% Acute accent \' Left paren \( Right paren \) %% Asterisk \* Plus \+ Comma \, %% Minus \- Point \. Solidus \/ %% Colon \: Semicolon \; Less than \< %% Equals \= Greater than \> Question mark \? %% Commercial at \@ Left bracket \[ Backslash \\ %% Right bracket \] Circumflex \^ Underscore \_ %% Grave accent \` Left brace \{ Vertical bar \| %% Right brace \} Tilde \~} % % \CheckSum{207} % % \begin{abstract} % The \cs\lips command generates text ellipses that are closer to what % \manual suggests than what \cs\dots produces. It does the right thing in % most circumstances, and so is easy to use. % \end{abstract} % \tableofcontents % % \part{Discussion} % % \section{Text Ellipses} % % \DescribeMacro{\lips} % The macro \cs\lips should be used for all text ellipses, that is, ellipses % not part of a mathematical expression. % % \manual does not acknowledge different spacings after different marks of % punctuation, distinguish interword from intersentence space, or give rules % about where to break a line near an ellipsis. Given a context where such % spaces do vary and rules for linebreaks can be given, I arrived at the % following rules for handling them around ellipses. % \begin{enumerate} % \item Pre-, post-, and intra-ellipsis space is normal intra-word space, which % should be 3-to-em. In \LaTeX{} there is also some glue (it's a % ``rubber space''). % \item When non-period punctuation $p$ follows \cs\lips, $p$ is followed by % the space that normally follows $p$. % \item A period following \cs\lips is treated as if the period preceded % \cs\lips. Conceptually, an ellipsis never precedes a period, so % conceptually there is only one case; but it is convenient to be able to % type either \code{\lips.} or \code{.\lips}. % \item Lines are a tiny bit breakable before ellipses and a tiny bit % breakable after ellipses that are not followed by punctuation. % \end{enumerate} % % In figure~\ref{fig:usage} are examples of correct usage and in % figure~\ref{fig:comp} is a comparison of \cs\lips to \cs\dots. You can % substitute any of the characters \code$!"()*+,-/:;=?@[]'`|<>~{}$ for the % exclamation point in the examples. There can be additional contiguous spaces % after \cs\lips, just like after any command name. There can also be % contiguous spaces before \cs\lips. % % \begin{figure} % \DeleteShortVerb{\|} % \begin{center} % \begin{tabular}{lc} % \bfseries source & \bfseries \hspace*{4em} result % \end{tabular}\par\nobreak % \par\nobreak % \begin{tabular}{|lp{1in}|} % \hline % \verb*|Hello\lips. And| & Hello\lips. And \\\hline % \verb*|Hello \lips. And| & Hello \lips. And \\\hline % \verb*|Hello.\lips And| & Hello.\lips And \\\hline % \verb*|Hello. \lips And| & Hello. \lips And \\\hline % \verb*|one,\lips, three| & one,\lips, three \\\hline % \verb*|one, \lips, three| & one, \lips, three \\\hline % \verb*|Hello\lips and| & Hello\lips and \\\hline % \verb*|Hello \lips and| & Hello \lips and \\\hline % \verb*|Hello!\lips And| & Hello!\lips And \\\hline % \verb*|Hello! \lips And| & Hello! \lips And \\\hline % \end{tabular} % \end{center} % \caption{\label{fig:usage}Examples of correct usage of \cs\lips.} % \MakeShortVerb{\|} % \end{figure} % % \begin{figure} % \begin{center} % \begin{tabular}{lc} % \bfseries source & \bfseries \hspace*{4em} result % \end{tabular}\par % \par % \DeleteShortVerb{\|} % \begin{tabular}{|lp{1in}|} % \hline % \verb*|Hello\dots. And| & Hello\dots. And \\ % \verb*|Hello\lips. And| & Hello\lips. And \\\hline % \verb*|Hello \dots. And| & Hello \dots. And \\ % \verb*|Hello \lips. And| & Hello \lips. And \\\hline % \verb*|Hello.\dots And| & Hello.\dots And \\ % \verb*|Hello.\lips And| & Hello.\lips And \\\hline % \verb*|Hello. \dots And| & Hello. \dots And \\ % \verb*|Hello. \lips And| & Hello. \lips And \\\hline % \verb*|one,\dots, three| & one,\dots, three \\ % \verb*|one,\lips, three| & one,\lips, three \\\hline % \verb*|one, \dots, three| & one, \dots, three \\ % \verb*|one, \lips, three| & one, \lips, three \\\hline % \verb*|Hello\dots and| & Hello\dots and \\ % \verb*|Hello\lips and| & Hello\lips and \\\hline % \verb*|Hello \dots and| & Hello \dots and \\ % \verb*|Hello \lips and| & Hello \lips and \\\hline % \verb*|Hello!\dots And| & Hello!\dots And \\ % \verb*|Hello!\lips And| & Hello!\lips And \\\hline % \verb*|Hello! \dots And| & Hello! \dots And \\ % \verb*|Hello! \lips And| & Hello! \lips And \\\hline % \end{tabular} % \end{center} % \caption{\label{fig:comp}Comparison of \cs\lips with \cs\dots.} % \MakeShortVerb{\|} % \end{figure} % % \section{Line breaking considerations} % % \DescribeMacro\LPNobreakList % When \cs\lips is followed by certain punctuation (\code|,:;?!)']}/| by % default), we never want to break a line after the ellipsis and before that % punctuation. For the other punctuation, such as open parenthesis and open % quote, we want normally breakable space following the ellipsis. % \cs\LPNobreakList is a list of those characters before which \cs\lips % should \emph{never} break a line. To force unbreakable space following % \cs\lips, follow \cs\lips with a tie (|~|). % % \section{Limitations} % % \cs\lips does the right thing after \cname{par}, but after \cs\indent or % \cs\noindent there is an extra preceding space (see the final section on % testing for an example). Suggestions on how to handle this problem are % welcome. % % \StopEventually{} % % \part{Implementation} % % \section{Version control} % % \begin{macro}{\fileinfo} % \begin{macro}{\DoXUsepackagE} % \begin{macro}{\HaveECitationS} % \begin{macro}{\fileversion} % \begin{macro}{\filedate} % \begin{macro}{\docdate} % \begin{macro}{\PPOptArg} % These definitions must be the first ones in the file. % \begin{macrocode} \def\fileinfo{Chicago Manual text ellipses (Frankenstein's lips)} \def\DoXPackageS {} \def\initelyHavECitationS {} \def\fileversion{v2.1} \def\filedate{2001/08/31} \def\docdate{2001/08/31} \edef\PPOptArg {% \filedate\space \fileversion\space \fileinfo } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % If we're loading this file from a \cs\ProcessDTXFile command (see the % \package{compsci} package), then \cs\JusTLoaDInformatioN will be defined; % othewise we assume it is not (that's why the FunkY NamE). % % If we're loading from \cs\ProcessDTXFile, we want to load the packages listed % in \cs\DoXPackageS (needed to typeset the documentation for this file) and % then bail out. Otherwise, we're using this file in a normal way as a % package, so do nothing. \cs\DoXPackageS, if there are any, are declared in % the \ext{dtx} file, and, if you're reading the typeset documentation of this % package, would appear just above. (It's OK to call \cs\usepackage with an % empty argument or \cs\relax, by the way.) % \begin{macrocode} \makeatletter% A special comment to help create bst files. Don't change! \@ifundefined{JusTLoaDInformatioN} {% }{% ELSE (we know the compsci package is already loaded, too) \UndefineCS\JusTLoaDInformatioN \SaveDoXVarS \eExpand\csname DoXPackageS\endcsname\In {%use \csname in case it's undefined \usepackage{#1}% }% \RestoreDoXVarS \makeatother \endinput }% A special comment to help create bst files. Don't change! % \end{macrocode} % % Now we check for \LaTeX2e and declare the LaTeX package. % \begin{macrocode} \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{lips}[\PPOptArg] % \end{macrocode}^^A special comment to help create bst files. Don't change! % % ^^A NOTE: We have to compensate for the above backslashes, which are not % ^^A actually in the .dtx file the author works on, by adding to the % ^^A CheckSum. %% % \AddToCheckSum{17}^^A `dtx-update-checksum' automatically handles this. % \AddToCheckSum{7}^^A The half a macrocode env. at the top is missed, however... % \AddToCheckSum{10}^^A ... and so are the 5 \defs from the .dtx file % ^^A that precede it. % \IfCitations {% % \AddToCheckSum{2}^^A When \initelyHavECitationS is defined in % } ^^A the .dtx file, we need 2 more in the CheckSum. % % % \section{The macro} % % \begin{macro}{\Lips} % \begin{macro}{\BracketedLips} % \begin{macro}{\lips} % \begin{macro}{\olips} % If we're in math mode, raise an error. If we're in vertical mode, leave it % and do an ellipsis not breakable at the end. If we're in horizontal mode, % call \cname{lp@lips@hmode}. % % Normally I would use \cs\NewRobustCommand, but this seems not enough reason % to require the \package{moredefs} package. We reserve the name \cs\lips by % hand. In the future, this package may require \package{moredefs}. % \begin{macrocode} \newcommand*\Lips {} \let\Lips\relax \DeclareRobustCommand\Lips {% \ifmmode \def\sc@t@a {% \PackageError{lips} {Don't use \protect\lips \space in math mode; use \protect\dots.}\@ehc }% \else \ifvmode \def\sc@t@a {% \leavevmode .\nobreak\ .\nobreak\ .\nobreak\ % }% \else \let\sc@t@a\lp@lips@hmode \fi \fi \sc@t@a } \newcommand*\BracketedLips {} \let\BracketedLips\relax \DeclareRobustCommand\BracketedLips {% \ifmmode \def\sc@t@a {% \PackageError{lips} {Don't use \protect\lips \space in math mode; use \protect\dots.}\@ehc }% \else \ifvmode \def\sc@t@a {% \leavevmode [.\nobreak\ .\nobreak\ .]\nobreak\ % }% \else \let\sc@t@a\lp@blips@hmode \fi \fi \sc@t@a } % \end{macrocode} % \todo{need the relax to avoid mistaking as optarg in some % contexts?} In MLA style, that is, with the \option{mla} option, \cs\lips % gives you brackets, meaning you To get no brackets, use \cs\olips for % ``original lips,'' that is, ellipses in the original document. \todo{Better % dox here. Are options case sensitive? If so, make MLA=mla.} % \begin{macrocode} \newlet\lips\Lips \newlet\olips\lips \DeclareOption{mla} {% \let\lips\BracketedLips } \ProcessOptions % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\lp@lips@hmode} % \begin{macro}{\lp@blips@hmode} % \begin{macro}{\GobbleIgnoreSpaces} % The horizontal mode case. Then we remove the last skip on the horizontal % list. If the next character is a period, we want to act as if the period % preceded \cs\lips, so we plonk down a period, a minimally-breakable space, % then an ellipsis ending with normally-breakable space. This keeps the % ellipsis on the same line as the sentence it follows if at all possible, % but allows it to spill onto the next line if there's no other way to avoid % an overfull line. Then we want to gobble up the period that's about to % come, and ignore any spaces after it, since we've already inserted proper % space. % % If the next character is not a period, we output a minimally-breakable % space and an ellipsis. To decide whether to follow it with unbreakable or % normally-breakable space, we need to know more about the next character % than just that it is not a period, so we \cs\let it to scratch |a| and call % \cname{lp@lips@check@punct}. % % \todo{document different logic with bracketed lips; how the heck to handle % greater inter-sentence space?} % \begin{macrocode} \newcommand\lp@lips@hmode {% \unskip \@ifnextchar . {% .\penalty9999\ .\nobreak\ .\nobreak\ .\ % \GobbleIgnoreSpaces }{% ELSE \penalty9999\ .\nobreak\ .\nobreak\ .% \futurelet\sc@t@a\lp@lips@check@punct }% } % hmm, have to keep the check for period i guess because i don't want it in % nobreaklist? because the break/nobreak is different? because it's more efficient? \newcommand\lp@blips@hmode {% \unskip \@ifnextchar . {% \penalty9999\ [.\nobreak\ .\nobreak\ .]% }{% ELSE \penalty9999\ [.\nobreak\ .\nobreak\ .]% \futurelet\sc@t@a\lp@lips@check@punct }% } \newcommand\GobbleIgnoreSpaces [1] {% \ignorespaces } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\LPNobreakList} % \begin{macro}{\lp@} % We'd like to use \code{\ifcat.\sc@t@a} for this, but that won't work when % we get a command sequence in scratch |a|. Bummer. % Do I really need to define all this punctuation now? It protects against % something becoming an active char or otherwise changing catcodes after the % \package{lips} package is loaded. % \begin{macrocode} \newcommand*\lp@bang {} \newcommand*\lp@rparen {} \newcommand*\lp@comma {} \newcommand*\lp@slash {} \newcommand*\lp@colon {} \newcommand*\lp@semic {} \newcommand*\lp@q {} \newcommand*\lp@rbrack {} \newcommand*\lp@rquote {} \newcommand*\lp@tilde {} \let\lp@bang=! \let\lp@rparen=) \let\lp@comma=, \let\lp@slash=/ \let\lp@colon=: \let\lp@semic=; \let\lp@q=? \let\lp@rbrack=] \let\lp@rquote=' \let\lp@tilde=~ % \egroup % \end{macrocode} % I'm making an attempt to put these in order of expected frequency. A % doublequote could be at the beginning or end of a quotation, so half the time % you'll have to correct by adding |{}|, so let's leave it out % so there's one less to check. % \begin{macrocode} \newcommand \LPNobreakList {% \lp@comma \lp@colon \lp@semic \lp@q \lp@bang \lp@rparen \lp@rquote \lp@rbrack \egroup \lp@slash } % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\lp@lips@check@punct} % Add nonbreakable space if scratch |a| is in \cs\LPNobreakList; add % normally-breakable space otherwise. Add no space at all if scratch |a| is % a tie---the tie will add nonbreakable space. We use just the guts of % \cname{@tfor} for efficiency. % \begin{macrocode} \newcommand\lp@lips@check@punct {% \ifx\sc@t@a\lp@tilde \else \@tempswatrue \let\@fortmp\PunctList \expandafter\@tforloop\LPNobreakList\@nil\@nil\@@\reserved@a {% \ifx\sc@t@a\reserved@a \@tempswafalse \@break@tfor \fi }% \if@tempswa \ % \else \nobreak\ % \fi \fi } % \end{macrocode} % \end{macro} % % You might want to compare the \LaTeX{} version (as of 95/12/01). % \cname{fontdimen3} is the interword stretchability, not interword space. % \begin{codeexample} % \DeclareTextCommandDefault{\textellipsis}{% % .\kern\fontdimen3\font % .\kern\fontdimen3\font % .\kern\fontdimen3\font % } % \def\mathellipsis{\mathinner{\ldotp\ldotp\ldotp}} % \DeclareRobustCommand{\dots}{% % \ifmmode\mathellipsis\else\textellipsis\fi % } % \let\ldots\dots % \end{codeexample} % % \part{Testing} % % \section{Ante-\cs\lips} % % This is some testing. We need some text here as the first paragraph after % the \cs\section. % % : \lips. % % : \lips text. % % : \lips) % % ; \lips. % % ; \lips text. % % ; \lips) % % ! \lips. % % ! \lips text. % % ! \lips) % % t \lips. % % t \lips text. % % t \lips) % % T \lips. % % T \lips text. % % T \lips) % % , \lips. % % , \lips text. % % , \lips) % % \par \lips and (|\par \lips and|) % \par and (|\par and|) % % \par\indent \lips (|\par\indent \lips and|) % \par\indent and (|\par\indent and|) % % \par\noindent \lips and (|\par\noindent \lips and|) % \par\noindent and (|\par\noindent and|) % % \par And.\lips \par (|And.\lips \par|) % \par And. \par (|And. \par|) % % \section{Post-\cs\lips} % % \cs\lips before a tie: One two three.\lips~tiedtolips (I doubt you'd want to % do this.) % % \cs\lips before ), e.g., punctuation transparent to spacefactors: % % (One two three.\lips)\ This follows the ) with interword space, to compare. % % (One two three.\lips) This should follow the ) with intersentence space. % % (One two three.\lips\@) This should follow the ) with intersentence space. % % \cs\lips before shortverb: \lips |shortverb verbatim stuff| % % \cs\lips before \cs\textsf: \lips \textsf{sansserif} % % \begin{center} % \cs\lips before |\\|: \lips \\ % second line of a \env{center} environment % \end{center} % % \cs\lips before \cs\#: \lips \# % % \cs\lips before |<|: \lips < % % \cs\lips before an abbrev: \lips \Frankenstein % % \cs\lips before \cs\cite: \lips \cite{chicago:14} % % \cs\lips before |$|: \lips $f=ma$ ^^A$ % %^^A \cs\lips in math mode (error!): $\lips^2$ % % \begin{tabular}{ll} % \cs\lips before |&|: \lips & second column of a \env{tabular} % \end{tabular} % % \Finale