diff options
author | Karl Berry <karl@freefriends.org> | 2012-01-16 23:59:23 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2012-01-16 23:59:23 +0000 |
commit | 6efb8e3714f12f3e72828b5cc5fc8be58671e768 (patch) | |
tree | e8fbda6989c41a04d4e6fb20e4c938db114712b5 /Master/texmf-dist/source/latex/fixltxhyph | |
parent | 503ec6c5f74d002c0d4d6fa3739e42f5e3e6c503 (diff) |
new latex package fixltxhyph (16jan12)
git-svn-id: svn://tug.org/texlive/trunk@25122 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/fixltxhyph')
-rw-r--r-- | Master/texmf-dist/source/latex/fixltxhyph/fixltxhyph.dtx | 313 |
1 files changed, 313 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/fixltxhyph/fixltxhyph.dtx b/Master/texmf-dist/source/latex/fixltxhyph/fixltxhyph.dtx new file mode 100644 index 00000000000..3f0416dd2b9 --- /dev/null +++ b/Master/texmf-dist/source/latex/fixltxhyph/fixltxhyph.dtx @@ -0,0 +1,313 @@ +% \iffalse meta-comment +% !TEX encoding = IsoLatin +%<*internal> +\begingroup +\input docstrip.tex +\keepsilent +\preamble + ______________________________________________________ + The FiXLtxHyph package + Copyright (C) 2011 Claudio Beccari + All rights reserved + + License information appended + +\endpreamble +\postamble + +Copyright 2011 Claudio Beccari + +Distributable under the LaTeX Project Public License, +version 1.3c or higher (your choice). The latest version of +this license is at: http://www.latex-project.org/lppl.txt + +This work is "author-maintained" + +This work consists of this file .dtx, a README file +the derived file fixltxhyph.sty, and the English +documentation fixltxhyph.pdf. + + +By running pdflatex on fixltxhyph.dtx the user gets the sty file, +and the English documentation file in pdf format. + +\endpostamble +\askforoverwritefalse + +\generateFile{fixltxhyph.sty}{t}{\from{fixltxhyph.dtx}{style}} + +\def\tmpa{plain} +\ifx\tmpa\fmtname\endgroup\expandafter\bye\fi +\endgroup +%</internal> +% +% \fi +% +% \iffalse +%<*driver> +\documentclass{ltxdoc} +\ProvidesFile{fixltxhyph.dtx}[2011/12/29 v.0.2a Documented TeX file for +the FixLtxHyph bundle] +\GetFileInfo{fixltxhyph.dtx} +\usepackage[latin1]{inputenc} +\usepackage[T1]{fontenc} +\usepackage{lmodern} +\usepackage{color} +\usepackage{multicol} +\title{\centering The FixLtxHyph bundle\protect\\ +A small fix in order to hyphenate emphasized words after a vocalic elision\protect\\ +in Catalan, French, Italian and Romansh} +\date{\fileversion\space\filedate} + \author{Claudio Beccari} +\usepackage{array} +\usepackage{metalogo} +\def\prog#1{\textsf{#1}} +\begin{document}\errorcontextlines=9 +\maketitle +\begin{multicols}{2} +\tableofcontents +\end{multicols} + \setlength\hfuzz{20pt} + \DocInput{fixltxhyph.dtx} +\end{document} +%</driver> +% \fi +% \CheckSum{50} +% +% \begin{abstract} +% This file fixes a small feature of the hyphenation algorithm used by the \TeX\ system +% typesetting engines that manifests itself only with those languages that use the +% apostrophe for marking a vocalic elision. This small package was set up to fix this +% little undesirable feature in Italian, but it was extended to Catalan, French and the +% future implementation of the fourth official Swiss language Rumantsch Grischun (Romansh +% in English). +% \end{abstract} +% \section{What is the feature to be fixed} +% The four languages Catalan, French, Italian and Romansh use the apostrophe for marking +% the vocalic elision of the ending vowel at the end of prepositions, articles, articulated +% prepositions, definite adjectives, and other words playing similar rôles when they just +% precede a nouns, adjectives, verbs, numerals, that start with a vowel. +% +% This feature is common to most Romance languages (from West to East) from Catalan and +% Valencian, to French, Langue d'oc, Occitan, Provençal, Vivaroalpin, Italian, Piedmontese, +% Lombard, Romansh, Ladin, Friulian; up to now only Catalan, French and Italian are handled +% by the \TeX\ system programs; at the same time most of these languages are minority ones +% and are being protected by local legislation or are supported by specific cultural or +% linguistic institutions; only Romansh has got a national/federal legal status in +% Switzerland and is being used in legal and official documents in the Swiss Confederation, +% not only in its area of everyday use, the Kanton Graubunden or Canton Grigioni or +% Chantun Grischun (where seven Romansh varieties are being spoken, besides Swiss +% German, Italian, and other languages). +% +% This spelling rule is very rigorous in French; I suppose it is also a rigorous rule in +% Catalan and Romansh, but I am not that familiar with these languages even if I can +% understand their written forms. In Italian it used to be a rigorous rule many years ago, +% but nowadays it is less frequently used when plurals are involved. +% Nevertheless apostrophes are practically the only para-alphabetic sign you see in an +% Italian text except for letters and punctuation marks. +% +% In order to hyphenate correctly these word combinations all four languages have to +% declare the apostrophe, that has a category code of~12, as a glyph with non zero lower +% case code. In facts all four languages declare: +%\begin{verbatim} +%\lccode`\'=`\' +%\end{verbatim} +% or something equivalent. With this little trick, the typesetting engine considers the +% apostrophe as a valid word character and treats the whole string as a single word; the +% patterns of these languages, of course, take into consideration also the apostrophe so +% that the following correct line break points are easily found\footnote{For typesetting +% Romansh and hyphenating it, initially I wrote myself a short language definition file, +% where, among other things, Romansh was considered as a dialect of Italian. In this way I did +% not need to build up the specific Romansh patterns; of course this was done only for thesting +% this small package. +% With my great surprise, my first feeling was that Italian patterns did a pretty +% good job (the common Latin ancestor helps a lot, of course); I spotted only very few final +% syllables without a vowel (which is wrong) and a couple of digraphs wrongly divided. After +% this ``successful'' start, I made up the Romansh hyphenation patters by just modifying the +% Italian ones in order to correct the few errors mentioned above; I checked my Romansh +% patterns aginst the hyphenation rules described in the \emph{Grammatica per l'instrucziun +% dal rumantsch grischun} published by the Department of romance languages and literature +% of the Friburg University, Switzerland. The patterns I produced work pretty well, but they +% are not built up for etimological hyphenation, therefore some prefixex or compound words +% might be divides without respecting the compound word barrier.}: +%\begin{center} +%\begin{tabular}{l>{\ttfamily}ll} +%Catalan & d'aquesta & d'a-ques-ta \\ +%French & l'électricité & l'élec-tri-ci-té \\ +%Italian & dell'eleganza & del-l'e-le-gan-za \\ +%Romansh & l'identitad & l'i-den-ti-tad +%\end{tabular} +%\end{center} +% +% So where is the problem? It emerges when the second part of the string is emphasized, +% because in this case no hyphenation takes place: +%\begin{center} +%\begin{tabular}{l>{\ttfamily}ll} +%Catalan & d'\string\emph\{aquesta\} & d'\emph{aquesta} \\ +%French & l'\string\emph\{électricité\} & l'\emph{électricité} \\ +%Italian & dell'\string\emph\{eleganza\} & dell'\emph{eleganza} \\ +%Romansh & l'\string\emph\{identitad\} & l'\emph{identitad} +%\end{tabular} +%\end{center} +% +% This behavior is easily explained, so that it is not to be considered a bug, but a +% feature; a feature that is annoying only when using the above four named languages. +% The point is that all \TeX\ system typesetting engines consider a word to be that +% character string starting after a character invalid in a word and finishing with the +% first token invalid in a word. Notice that when the hyphenating algorithm comes to work +% the command |\emph| has already been expanded and it ends up with the qualifications of +% the selected font; therefore a string such as \verb*| d'aquesta | (starting after +% a space and ending before the following space) is made up of valid characters; but +% \verb*| d'\emph{aquesta} | is a ``word'' starting after a space and ending before +% a space, but containing a font change. And this makes the word invalid for hyphenation. +% The \TeX\-book is clear on this respect: ``If a suitable letter is found [as a starting +% character], let it be in font $f$. \dots\ \TeX\ continues to scan forward until coming +% to something that's not one of the following three ``admissible items'': (1) a character +% in font $f$ whose |\lccode| is not zero; (2) a ligature formed entirely from characters +% of type (1); (3) an implicit kern. \dots\ Notice that all these letters are +% in font~$f$.'' +% +% This was a specific programming choice decided by Donald Knuth together with Frank Liang, +% his PhD student who developed the hyphenation algorithm implemented in the typesetting +% engines of the \TeX\ system\footnote{I have been told that Lua\TeX\ is developing +% a different algorithm that eliminates this feature.}. +% As all such decisions, it is a compromise between accuracy and speed. And remember the at +% the beginning \prog{tex} the program was used essentially with English, a language that +% does not use accented letters and uses elision in a much different way as the one we are +% speaking here. The problem did non exist and, I suppose, it will never exist in English. +% +% \section{The solutions} +% As a compromise I decided to solve the problem in an automatic way only when the second +% part of the ``word'' to be hyphenated is emphasized. I suppose it is the most frequent +% situation, although no one can avoid thinking to other situations; for example; the +% second part of such ``word'' after the apostrophe is bolded, is colored, is written +% in another font selected on purpose or is in another alphabet, it is in italics, with +% no choice on the inclination; in such cases the solution is manual and remains manual, +% because there are too many possibilities and it is cumbersome to deal with all of them. +% +% But manual or automatic, how should we proceed? Simply we must convince that the +% starting letter must not be the start of the part preceding the apostrophe, but what +% follows it. +% This is simple: it suffices to put after the apostrophe a unbreakable zero width glob of +% glue; \TeX\ starts looking for a potential starting letter after the glue. +% Therefore the manual solution consists in defining a short macro such as the following +% one: +%\begin{verbatim} +%\newcommand\hz{\nobreak\hskip\z@skip} +%\end{verbatim} +% or, if you want to avoid setting this short command into a personal \texttt{.sty} file, +% simple change |\z@skip| with |0pt|. You will then have to change the font changing +% phrase in something such as: +%\begin{verbatim} +%... d'\hz\textbf{aquesta} ... +%\end{verbatim} +% The |\hz|, whose name reminds the sentence ``Horizontal skip of an unbreakable Zero width +% glob of glue'', finishes the preceding word and sets the grounds for starting the search +% of a new starting letter of another word; it will be found after the font selections code +% introduced in the horizontal list by the selected font identification. +% +% The automatic solution, on the opposite, implies a small but substantial modification of +% the |\emph| command. In facts the text command uses the text declaration |\em| and as +% such the latter is much simpler to modify by simply attaching the command |\hz| at the +% end % of its definition. +% +% This small packages does exactly this, only for the four named languages, and only if +% they are used, and only with the |\emph| command. The |\hz| command is available to the +% user in a global way, so that when this package is loaded, the manual solution remains +% valid for every language, although in very unlikely situations. +% +% It has been tested with the four languages (Romansh in a very embryonal state) and +% apparently it works as expected; it has been throughly tested in all situations with +% Italian; it should work properly also in French and in Romansh. The adopted solution +% does not fiddle with active characters and therefore it does not interfere with the +% internal workings and settings of Catalan and the other languages. +% +% \section{Installation} +% With modern \TeX\ distributions these instructions are superfluous; should you need to +% install by hand, download from \textsc{ctan} in a scratch directory (possibly create one, +% and after finishing, delete the whole directory with its contents) run this file +% \texttt{fixltxhyph.dtx} through \prog{pdflatex}; you get two files and move them +% as follows: +%\begin{itemize} +%\item Move all the files in the following directories on your disk; if you don't already +% have those directories, create them. +%\item These directories should be created in your personal \texttt{texmf} tree; if you +% don't have one, create it; how to do this and where to root it depends on your operating +% system; before doing any change to your hard disk, please read carefully the TeX Live +% or the MiKTeX documentations in order to find out what a personal tree is. +%\item Move \texttt{fixltxhyph.dtx} to \texttt{.../texmf/source/latex/FixLtxHyph/}; +%\item Move \texttt{fixltxhyph.pdf} to \texttt{.../texmf/doc/latex/FixLtxHyph/}; +%\item Move \texttt{fixltxhyph.sty} to \texttt{.../texmf/tex/latex/FixLtxHyph/}; +%\item if your distribution requires it, refresh the file name database. +%\end{itemize} +%You are now ready to use the package by simply invoking it in the preamble of your +% documents: +%\begin{verbatim} +%\usepackage{fixltxhyph} +%\end{verbatim} +% +%\section{Aknowledgements} +%I wish to thank Lorenzo Pantieri who tested the preliminary and the actual versions of +% this package and directly or indirectly helped debugging the code, especially in the +% preliminary version that used active characters and was particularly buggy. +% +% \StopEventually{} +% +%\section{The documented code} +% We start by identifying the package and the necessary format file: +% \begin{macrocode} +%<*style> +\ProvidesPackage{fixltxhyph}[2011/12/25 v.0.1 Small fix for hyphenating +emphasized words preceded by vocalic elision] +\NeedsTeXFormat{LaTeX2e}[2011/06/27] +% \end{macrocode} +% Then we make sure that the package \texttt{babel} has already been loaded; otherwise +% we warn the user and exit; no patches can be made to an unknown package. +% \begin{macrocode} +\@ifpackageloaded{babel}{}{% +\PackageWarning{FixLtXHyph}{This package must be loaded after babel}% +\endinput} +% \end{macrocode} +% +% We define a very short command |\hz| in order to have available a handy command +% for inserting an unbreakable zero width glob of glue in case we needed to do some +% sort of patching by hand. +% \begin{macrocode} +\newcommand\hz{\nobreak\hskip\z@skip} +% \end{macrocode} +% We make patches only if one or more of the four languages Catalan, French, Italian, or +% Romansh has been invoked as an option to \texttt{babel}; if none of these options had +% been selected, evidently the user had his/her thoughts focused on other details, so +% that s/he missed the point that this patch is necessary only for the above mentioned +% four languages. In any case no harm should happen if from now on nothing gets done, +% except for the definition of |hz| that remains available to the user. +% +% The next bit of code defines some aliases in order to keep the original meaning of the +% declaration |\em|; in order to patch an alias, so as to be able to set the proper +% definitions only for the named four languages and to rest the original situation when a +% change of language takes place. +% \begin{macrocode} +\let\originalem\em +\let\newem\em +\addto\newem{\hz} +% \end{macrocode} +% +% We then use a repetition cycle based on a list of language names; if the +% language with one of the listed names has been invoked as an option to \texttt{babel}, +% then the patched |\em| definition is made the default, while when changing language the original definition is restored: +% \begin{macrocode} +\def\@tempB{catalan,french,italian,romansh} +\@for\@tempA:=\@tempB\do{% +\expandafter\ifx\csname captions\@tempA\endcsname\relax\else +\expandafter\addto\csname extras\@tempA\endcsname{\let\em\newem}% +\expandafter\addto\csname noextras\@tempA\endcsname{\let\em\originalem}\fi} +% \end{macrocode} +% +% Eventually the documented file is terminated and its final commands are issued. +%\begin{macrocode} +\endinput +%</style> +% \end{macrocode} +% +% \Finale +% \endinput |