% \iffalse meta-comment
%
%
% It may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license 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.3 or later is part of all distributions of LaTeX
% version 2003/12/01 or later.
%
% This work has the LPPL maintenance status "maintained".
%
% The Current Maintainer of the babel system is Javier Bezos
% The current maintainer of Italian language support is Claudio Beccari
%
% The list of all files belonging to the LaTeX base distribution is
% given in the file `manifest.bbl. See also `legal.bbl' for additional
% information.
%
% The list of derived (unpacked) files belonging to the distribution
% and covered by LPPL is defined by the unpacking scripts (with
% extension .ins) which are part of the distribution.
% \fi
% \CheckSum{740}
% \iffalse
%    Tell the \LaTeX\ system who we are and write an entry on the
%    transcript.
%\fi
%\iffalse
%<*filedriver>
\ProvidesFile{italian.dtx}
%</filedriver>
%<code>\ProvidesLanguage{italian}
%<*code>
        [2015/03/26 v1.3n Italian support from the babel system]
%</code>
%%
%% Please report errors to: claudio dot beccari at gmail dot com
%%
%
%    This file is part of the babel system, it provides the source
%    code for the Italian language definition file.
%    The original version of this file was written by Maurizio
%    Codogno, (mau@beatles.cselt.stet.it). 
%    The package was completely rewritten by Claudio Beccari, who added
%    several features.
%<*filedriver>
\documentclass{ltxdoc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{booktabs}
\newcommand*\TeXhax{\TeX hax}
\newcommand*\babel{\textsf{babel}}
\newcommand*\langvar{$\langle \it lang \rangle$}
\newcommand*\note[1]{}
\newcommand*\Lopt[1]{\textsf{#1}}
\newcommand*\file[1]{\texttt{#1}}
\begin{document}
 \DocInput{italian.dtx}
\end{document}
%</filedriver>
%\fi
% \GetFileInfo{italian.dtx}
%
% \changes{italian-0.99}{1990/07/11}{First version, from english.doc}
% \changes{italian-1.0}{1991/04/23}{Modified for babel 3.0}
% \changes{italian-1.0a}{1991/05/23}{removed typo}
% \changes{italian-1.0b}{1991/05/29}{Removed bug found by van der Meer}
% \changes{italian-1.0e}{1991/07/15}{Renamed \file{babel.sty} in
%    \file{babel.com}}
% \changes{italian-1.1}{1992/02/16}{Brought up-to-date with babel 3.2a}
% \changes{italian-1.2}{1994/02/09}{Update for\ LaTeXe}
% \changes{italian-1.2e}{1994/06/26}{Removed the use of \cs{filedate}
%    and moved identification after the loading of \file{babel.def}}
% \changes{italian-1.2f}{1995/05/28}{Updated for babel 3.5}
% \changes{italian-1.2i}{1996/10/10}{Replaced \cs{undefined} with
%    \cs{@undefined} and \cs{empty} with \cs{@empty} for consistency
%    with \LaTeX, moved the definition of \cs{atcatcode} right to the
%    beginning.}
% \changes{italian-1.2l}{1999/04/24}{Added \cs{unit}, \cs{ap}, and
%    \cs{ped} macros}
% \changes{italian-1.2m}{2000/01/05}{Added support for etymological
%    hyphenation}
% \changes{italian-1.2n}{2000/02/02}{Completely modified etymological
%    hyphenation facility}
% \changes{italian-1.2n}{2000/05/28}{Added several commands for the
%   caporali double quotes and for simplifying the accented vowel input}
% \changes{italian-1.2o}{2000/12/12}{Added \cs{glossaryname}}
% \changes{italian-1.2p}{2002/07/10}{Removed redefinition of
%    \cs{add@acc} since its functionality has been introduced into the
%    kernel of LaTeX 2001/06/01}
% \changes{italian-1.2q}{2005/02/05}{Added test for avoiding conflict
%    with package units.sty; adjusted caporali functionality, since
%    the previous one did not work with the standard (although obsolete)
%    slides class file}
% \changes{italian-1.3}{2013/09/29}{Completely changed the Italian
%   guillemet functionality in order to simplify their handling}
% \changes{italian-1.3}{2013/09/30}{Eliminated the \emph{traditional} attribute;
%   the same functionality is obtained with the declaration \cs{XXIletters}}
% \changes{italian-1.3}{2-13/09/30}{Command \cs{unit} is disabled if packages
%   units, SIunits, or siunitx have been loaded; this control is now deferred
%   at the end of the preamble, when all packages have already been loaded}
% \changes{italian-1.3a}{2013/10/02}{Eliminated conflict with the amsmath
%   package}
% \changes{italian-1.3-d}{2013/11/11}{Corrected the \string" behaviour for
%   etymological hyphenation}
% \changes{italian-1.3f}{2013/11/22}{Deleted extra \cs{selectlanguage}\{italian\}}
% \changes{italian-1.3g}{2014/02/16}{Corrected the \string"/ shorthand}
% \changes{italian-1.3g}{2014/02/16}{Italian shorthandss are now optional as
%   well as the intelligent comma facility}
% \changes{italian-i.3i}{2014/02/17}{Updated documentation}
% \changes{italian-1.3i}{2014/02/17}{Modified the \string"- shorthand}
% \changes{italian-1.3j}{2014/02/22}{\string\setactivedoublequote\ does work
%   but it must be delayed until \string\begin\{document\}; with babel 3.9g
%   the main language is set before this point, therefore it is necessary
%   to select again the Italian language if this is the main one}
% \changes{italian-1.3k}{2014/03/29}{Corrected discrepancy between 
%   \cs{SetISOcompliance} (wrong in  documentation) and \cs{setISOcompliance}
%   (correct in code)}
% \changes{italian-1.3l}{2014/05/25}{Corrections in the documentation}
% \changes{italian-1.3m}{2015/03/12}{More corrections to the documentations,
%  specifically on conflicts with the dcolumn package and its D column.
%  The whole \(No)IntelligentComma mechanism has been actually completely
%  rewritten; so the change does not deal only with documentation, but also
%  with code.}
%
%  \section{The Italian language}
%    \textbf{Important notice}: This language description file relies on
%    functionalities provided by a modern TeX system distribution with
%    pdfLaTeX working in extended mode (eTeX commands available); it
%    should perform correctly also with XeLaTeX and LuaLaTeX; tests have
%    been made also with the latter programs, but it was really tested in
%    depth with |babel| and pdfLaTeX.
%
%    \bigskip
%
%    The file \file{\filename}\footnote{The file described in this
%    section has version number \fileversion\ and was last revised on
%    \filedate. The original author is Maurizio Codogno.
%    It was initially revised
%    by Johannes Braams and then completely rewritten by Claudio Beccari}
%    defines all the required and some optional language-specific
%    macros for the Italian language.
%
%    \begin{table}[htb]\centering
%    \begin{tabular}{cp{90mm}}
%    \toprule
%    |"|    & inserts a compound word mark where hyphenation is legal;
%             it allows etymological hyphenation which is recommended
%             for technical terms, chemical names and the like; it
%             does not work if the next character is represented with
%             a control sequence or is an accented character.\\
%    \texttt{\string"\string|}
%           & the same as the above without the limitation on
%            characters represented with control sequences or accented
%            ones.\\
%    |""|   & inserts open quotes ``.\\ %^^A'' emacs matching
%    |"<|   & inserts open guillemets without trailing space.\\
%    |">|   & inserts closed guillemets without leading space.\\
%    |"/|   & allows hyphenation of both words connected with slash.\\
%    |"-|   & allows hyphenation of both words connected with a short dash
%                (\emph{trattino copulativo}, in Italian)\\
%    \bottomrule
%    \end{tabular}
%    \caption{shorthands for the Italian language. These shorthands are
%    available only if command \texttt{\string\setactivedoublequote} is given
%    after loading \babel\ and before \texttt{\string\begin\{document\}}.}
%    \label{t:itshrtct}
%    \end{table}
%
%    The features of this language definition file are the following:
%    \begin{enumerate}
%    \item The Italian hyphenation is invoked, provided that the Italian 
%      hyphenation pattern files were loaded when the specific format file
%      was built.
%    \item The language dependent infix words to be inserted by such
%      commands as |\chapter|, |\caption|, |\tableofcontents|,
%      etc. are redefined in accordance with the Italian
%      typographical practice.
%    \item Since Italian can be easily hyphenated and Italian practice
%      allows to break a word before the last two letters, hyphenation
%      parameters have been set accordingly, but a very high demerit
%      value has been set in order to avoid word breaks in the
%      penultimate line of a paragraph. Specifically the |\clubpenalty|,
%      and the |\widowpenalty| are set to rather high values and
%      |\finalhyphendemerits| is set to such a high value that
%      hyphenation is strongly discouraged between the last two lines
%      of a paragraph.
%^^A
%^^A  Qui ci si potrebbero mettere le indicazioni per gli attributi e modificatori
%^^A
%    \item Some language specific shorthands have been defined so as to
%      allow etymological hyphenation, specifically |"| inserts a
%      break point at any word boundary that the typesetter chooses,
%      provided it is not followed by an accented letter (very unlikely
%      in Italian, where compulsory accents fall only on the last and
%      ending vowel of a word, but it may take place with compound words
%      that include foreign roots), and \verb="|= when the desired break
%      point falls before an accented letter. As you can read in
%      table~\ref{t:itshrtct}, these shorthands are available only if
%      they get activated with |\setactivedoublequote| after
%      loading \babel\ but before the |\begin{docuemnt}| statement. This
%      is done in order to preserve the user from package conflicts:
%      if s/he wants to use these facilities s/he must remember that
%      conflicts may arise unless active characters are deactivated;
%      this can be done with the \babel\ command |\shorthadsoff{"}|
%      (and reactivated with |\shorthandson{"}|) when its wise to do
%      so; conflicts have been reported with package \file{xypic} and
%      with \texttt{TikZ}, but the latter has its own library to
%      deactivate all active characters, not just the double quotes,
%      the only Italian language possibly activated  character.
%    \item Some Italian compound words have a connecting short dash (a
%      hyphen sign) between them without any space between the component
%      words and the short dash; in this situation standard \LaTeX\ allows
%      a line break only just after the short dash; this may lead to
%      paragraphs with protruding lines or with ugly looking wide inter
%      word spaces. If a break point is desired in the second word, one
%      may use  a |"| sign just after the short dash; but if a line break
%      is required in the first word, them the |"-| shorthand comes in handy;
%      pay attention though, that if you use an en-dash or an em-dash (both
%      should not be used in Italian as compound words connectors, but\dots)
%      then the |"-| shorthand might impeach the |--| or |---| ligatures, thus
%      producing an unacceptable appearance.
%    \item The shorthand |""| introduces the raised (English) opening
%      double quotes; this shorthand proves its usefulness when one
%      reminds that the Italian keyboard misses the backtick key, and
%      the backtick on a Windows based platform may be obtained only by
%      pressing the \texttt{Alt} key while keying the numerical code
%      0096 in the numeric keypad; very, very annoying!
%    \item The shorthands |"<| and |">| insert the guillemets sometimes
%      used also in Italian typography; with the T1 font encoding
%      the ligatures |<<| and |>>| should insert such signs directly,
%      but not all the virtual fonts that claim to follow the T1 font
%      encoding actually contain the guillemets; with the OT1 encoding
%      the guillemets are not available and must be faked in some
%      way. By using the |"<| and |">| shorthands (even with the T1
%      encoding) the necessary tests are performed and in case the
%      guillemets are faked by means of the special LaTeX math symbols.
%      At the same time if OpenType fonts are being used with XeLaTeX
%      or LuaLaTeX, there are no problems with guillemets.
%    \item Three new specific commands |\unit|, |\ped|, and |\ap| are
%      introduced so as to  enable the correct composition of technical
%      mathematics according to the ISO~31/XI recommendations. 
%      The definition of |\unit| takes place only at ``begin document''
%      so that it is possible to verify if some other similar functionalities
%      have already been defined by other packages, such as |units.sty|
%      or |siunitx.sty|. In particular command |\unit| is deactivated by
%      default; the user can activate it by entering the command
%      |\setISOcompliance| after loading the \babel\ package and before the
%      |\begin{document}| statement. The above checks will enter into
%      action even if this ISO compliance is set, in order to avoid conflicts
%      with the above named packages. The |\ap| and |\ped| commands remain
%      available because up to now no specific conflicts have been reported. 
%    \item Since in all languages different from English the decimal separator
%      according to the ISO regulations \emph{must} be a comma\footnote{Actually
%      the Bureau International des Pois et M\'esures allows also the point
%      as a decimal separator without mentioning any language, but recommends
%      to follow the national typographical traditions}; since
%      no language description file nor the \babel\ package itself provides
%      for this functionality, a not so simple intelligent comma definition is
%      provided such that at least in mathematics it behaves correctly.
%      There are other packages that provide a similar functionality, for
%      example |icomma| and |ncccomma|; |icomma|, apparently is not in conflict
%      with |dcolomn|, but requires a space after the comma all the times it
%      plays the r\^ole of a punctuation mark; |ncccomma|, checks if the next
%      token is a digit, but it repeated ten tests every time it meets a comma,
%      irrespective from what it is followed by. I believe that my solution
%      is better than that provided by both those packages; but I assume that
%      if the user loads on of those packages, it prefers to use that
%      functionality; In case one of those pachages is loaded, this module
%      excludes its intelligent comma functionality.
%      By default this functionality is turned \emph{off}, therefore the user
%      should turn it on by means of the |\IntelligentComma| command; it can
%      turn it off by means of |\NoIntelligentComma|. Please, read
%      subsection~\ref{ssec:comma} to see the various situations where a
%      mathematical comma may be used and how to overcome the few cases when
%      the macros of this file don't behave as expected. The section describes
%      also some limitations when some cong=flicting packages are being loaded.
%    \item In Italian legal documents it is common to tag list-items
%      with the old fashioned 21-letter Italian alphabet, that differs from
%      the Latin one by the omission of the letters `j', `k', `w',`x', and
%     `y'. This applies for both upper and lower case tags.
%      This feature is obtained by using the commands |\XXIletters| and
%      |\XXVIletters| that allow to switch back and forth
%      between 21- and 26-letter tagging.
%    \end{enumerate}
%
%    For this language a few shorthands have been defined,
%    table~\ref{t:itshrtct}, some of which are introduced to overcome
%    certain limitations of the Italian keyboard; in
%    section~\ref{s:itkbd} there are other comments and hints in order
%    to overcome some other keyboard limitations.
%
% \subsection*{Acknowlegements}
% It is my pleasure to acknowledge the contributions of Giovanni Dore,
% Davide Liessi, Grazia Messineo, Giuseppe Toscano, who spotted some bugs
% or conflicts with other packages, mainly |amsmath| and |icomma|, and
% with digits hidden inside macros or control sequences representing
% implicit characters. Testing by real users and their feedback is
% essential with open software such as the uncountable contributions
% to the \TeX\ system. Thank you very much.
%
% \StopEventually{%
%    \begin{thebibliography}{1}
%    \bibitem{CBec} Beccari C., ``Computer Aided Hyphenation for
%    Italian and Modern Latin'', \textsf{TUGboat} vol.~13, n.~1,
%    pp.~23-33 (1992).
%    \bibitem{Becc2} Beccari C., ``Typesetting mathematics for science
%    and technology according to ISO\,31/XI'', \textsf{TUGboat}
%    vol.~18, n.~1, pp.~39-48 (1997).
%    \end{thebibliography}}
%
%\subsection{The commented code}
%    The macro |\LdfInit| takes care of preventing that this file is
%    loaded more than once, checking the category code of the
%    \texttt{@} sign, etc.
% \changes{italian-1.2i}{1996/11/03}{Now use \cs{LdfInit} to perform
%    initial checks}
% \changes{italian-1.2j}{1996/12/29}{Added braces around second arg of
%    \cs{LdfInit}}
%\iffalse
%<*code>
%\fi
%    \begin{macrocode}
\LdfInit{italian}{captionsitalian}%
%    \end{macrocode}
%
%    When this file is read as an option, i.e. by the |\usepackage|
%    command, \texttt{italian} will be an `unknown' language in which
%    case we have to make it known.  So we check for the existence of
%    |\l@italian| to see whether we have to do something here.
%
% \changes{italian-1.0}{1991/04/23}{Now use \cs{adddialect} if
%    language undefined}
% \changes{italian-1.0h}{1991/10/08}{Removed use of \cs{@ifundefined}}
% \changes{italian-1.1}{1992/02/16}{Added a warning when no
%    hyphenation patterns were loaded.}
% \changes{italian-1.2e}{1994/06/26}{Now use \cs{@nopatterns} to
%    produce the warning}
%    \begin{macrocode}
\ifx\l@italian\@undefined
    \@nopatterns{Italian}%
    \adddialect\l@italian0\fi
%    \end{macrocode}
%
%    The next step consists of defining commands to switch to (and
%    from) the Italian language.
%
% \begin{macro}{\captionsitalian}
%    The macro |\captionsitalian| defines all strings used
%    in the four standard document classes provided with \LaTeX.
% \changes{italian-1.0c}{1991/06/06}{Removed \cs{global} definitions}
% \changes{italian-1.0c}{1991/06/06}{\cs{pagename} should be
%    \cs{headpagename}}
% \changes{italian-1.0d}{1991/07/01}{`contiene' substitued by `Allegati'
%    as suggested by Marco Bozzo (\texttt{BOZZO@CERNVM}).}
% \changes{italian-1.1}{1992/02/16}{Added \cs{seename}, \cs{alsoname}
%    and \cs{prefacename}}
% \changes{italian-1.1}{1993/07/15}{\cs{headpagename} should be
%    \cs{pagename}}
% \changes{italian-1.2b}{1994/05/19}{Changed some of the infix words}
% \changes{italian-1.2g}{1995/07/04}{Added \cs{proofname} for
%    AMS-\LaTeX}
% \changes{italian-1.2h}{1995/07/27}{Added translation of `Proof'}
%    \begin{macrocode}
\addto\captionsitalian{%
  \def\prefacename{Prefazione}%
  \def\refname{Riferimenti bibliografici}%
  \def\abstractname{Sommario}%
  \def\bibname{Bibliografia}%
  \def\chaptername{Capitolo}%
  \def\appendixname{Appendice}%
  \def\contentsname{Indice}%
  \def\listfigurename{Elenco delle figure}%
  \def\listtablename{Elenco delle tabelle}%
  \def\indexname{Indice analitico}%
  \def\figurename{Figura}%
  \def\tablename{Tabella}%
  \def\partname{Parte}%
  \def\enclname{Allegati}%
  \def\ccname{e~p.~c.}%
  \def\headtoname{Per}%
  \def\pagename{Pag.}%   
  \def\seename{vedi}%
  \def\alsoname{vedi anche}%
  \def\proofname{Dimostrazione}%
  \def\glossaryname{Glossario}%
  }%
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\dateitalian}
%    The macro |\dateitalian| redefines the command
%    |\today| to produce Italian dates.
% \changes{italian-1.0c}{1991/06/06}{Removed \cs{global} definitions}
%    \begin{macrocode}
\def\dateitalian{%
  \def\today{\number\day~\ifcase\month\or
    gennaio\or febbraio\or marzo\or aprile\or maggio\or giugno\or
    luglio\or agosto\or settembre\or ottobre\or novembre\or
    dicembre\fi\space \number\year}}%
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\italianhyphenmins}
% \changes{italian-1.2b}{1994/05/19}{Added setting of left and
%    righthyphenmin}
%
%    The italian hyphenation patterns can be used with both
%    |\lefthyphenmin| and |\righthyphenmin| set to~2.
% \changes{italian-1.2m}{2000/09/22}{Now use \cs{providehyphenmins} to
%    provide a default value}
%    \begin{macrocode}
\providehyphenmins{\CurrentOption}{\tw@\tw@}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\extrasitalian}
% \begin{macro}{\noextrasitalian}
%
% \changes{italian-1.2b}{1994/05/19}{Added settings of club- and
%    widowpenalty}
%    Lower the chance that clubs or widows occur.
%    \begin{macrocode}
\addto\extrasitalian{%
  \babel@savevariable\clubpenalty
  \babel@savevariable\widowpenalty
  \babel@savevariable\@clubpenalty
  \clubpenalty3000\widowpenalty3000\@clubpenalty\clubpenalty}%
%    \end{macrocode}
%
% \changes{italian-1.2b}{1994/05/19}{Added setting of
%    finalhyphendemerits}
%
%    Never ever break a word between the last two lines of a paragraph
%    in Italian texts.
%    \begin{macrocode}
\addto\extrasitalian{%
  \babel@savevariable\finalhyphendemerits
  \finalhyphendemerits50000000}%
%    \end{macrocode}
%
% \changes{italian-1.2h}{1995/11/10}{Now give the apostrophe a
%    lowercase code}
% \changes{italian-1.2l}{1999/04/5}{Changed example ``begl'italiani''
%    (obsolete spelling) with another, ``nell'altezza'', that behaves
%    the same way}
%    In order to enable the hyphenation of words such as
%    ``nell'altezza'' we give the \texttt{'} a non-zero lower case
%    code. When we do that \TeX\ finds the following hyphenation
%    points |nel-l'al-tez-za| instead of none.
%    \begin{macrocode}
\addto\extrasitalian{%
  \lccode`'=`'}%
\addto\noextrasitalian{%
  \lccode`'=0}%
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \subsection{Traditionally labelled enumerate environment}
% \changes{italian-1.2v}{2010/01/02}{Support for traditional Italian}
%    In some traditional texts, especially of legal nature, enumerations labelled
%    with lower or upper case letters use the reduced Latin alphabet that omits
%    the so called ``non Italian letters'': j, k, w, x, and y. 
%
% \changes{italian-1.2w}{2011/01/03}{Added switching mechanism between normal
%    and traditional enumeration labelling}
% \changes{italian-1.3}{2013/09/27}{The |traditional| language attribute has
%    been dropped while the commands to switch back and forth from 21- to
%    26-letter alphabet are retained}
% \begin{macro}{\XXIletters}
% \begin{macro}{\XXVIletters}
%    At the same time it is considered useful to have the possibility of
%    switching back and forth from the 21-letter tagging and the 26-letter one.
%    This requires a counter that keeps the switching status (0 for 21 letters
%    and 1 for 26 letters) and commands |\XXIletters| and |\XXVIletters| 
%    to set the switch. Default is 26 letter tagging.
%    \begin{macrocode}
\newcount\it@lettering \it@lettering=\@ne
\newcommand*\XXIletters{\it@lettering=\z@}
\newcommand*\XXVIletters{\it@lettering=\@ne}
\let\bbl@alph\@alph \let\bbl@Alph\@Alph
\addto\extrasitalian{\babel@savevariable\it@lettering
  \let\@alph\it@alph \let\@Alph\it@Alph}
\addto\noextrasitalian{\let\@alph\bbl@alph\let\@Alph\bbl@Alph}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%    To make this feasible it's necessary to redefine the way the \LaTeX\ |\@alph|
%    and |\@Alph| work. Let's make the alternate definitions:
%    \begin{macrocode}
\def\it@alph#1{%
\ifcase\it@lettering
   \ifcase#1\or a\or b\or c\or d\or e\or f\or g\or h\or i\or
   l\or m\or n\or o\or p\or q\or r\or s\or t\or u\or v\or
   z\else\@ctrerr\fi
\or
   \ifcase#1\or a\or b\or c\or d\or e\or f\or g\or h\or i\or
   j\or k\or l\or m\or n\or o\or p\or q\or r\or s\or t\or u\or v\or
   w\or x\or y\or z\else\@ctrerr\fi
\fi}%
\def\it@Alph#1{%
\ifcase\it@lettering
   \ifcase#1\or A\or B\or C\or D\or E\or F\or G\or H\or I\or
   L\or M\or N\or O\or P\or Q\or R\or S\or T\or U\or V\or
   Z\else\@ctrerr\fi
\or
   \ifcase#1\or A\or B\or C\or D\or E\or F\or G\or H\or I\or
   J\or K\or L\or M\or N\or O\or P\or Q\or R\or S\or T\or U\or V\or
   W\or X\or Y\or Z\else\@ctrerr\fi
\fi}%
%    \end{macrocode}
%
% In order to have a complete description, the situation is as such:
%    \begin{enumerate}
%    \item If you want to always use the 21-letter item tagging, simply
%       use the |\XXIletters| declaration just after |\begin{document}|
%       and this setting remains global (provided, of course, that the
%       declaration is defined, i.e. that the Italian language is the
%       default one); in this way the setting is global while you use
%       the Italian language.
%    \item The |XXVIletter| command, issued outside any environment sets
%       the 26-letter item tagging in a global way; this setting is the default one.
%    \item If you specify |\XXIletters| just before entering an
%       environment that uses alphabetic tagging, this environment will
%       be tagged with the 21-letter alphabet, but this is a local setting,
%       because the letter tagging takes place only from the second level
%       of enumeration.
%    \item The declarations |\XXIletters| and |\XXVIletters| let you 
%      switch back and forth between the two kinds of tagging, But this
%      kind of tagging, the 21-letter one, is meaningful only in Italian
%      and when you change language, letter tagging reverts to the 26-letter
%      one. 
%    \end{enumerate}
%
% \changes{italian-1.2m}{2000/01/05}{Support for etymological
%    hyphenation}
%
%   \subsection{Support for etymological hyphenation}

%    In Italian etymological hyphenation is desirable with
%    technical terms, chemical names, and the like.

%    \subsubsection{Some history}
%    In his article on Italian hyphenation \cite{CBec} Beccari pointed
%    out that the Italian language gets hyphenated on a phonetic
%    basis, although etymological hyphenation is allowed; this is in
%    contrast with what happens in Latin, for example, where
%    etymological hyphenation is always used. Since the patterns for
%    both languages would become too complicated in order to cope with
%    etymological hyphenation, in his paper Beccari proposed the
%    definition of an active character `|_|' such that it could insert
%    a ``soft'' discretionary hyphen at the compound word
%    boundary. For several reasons that idea and the specific active
%    character proved to be unpractical and was abandoned.
%
%    This problem is so important with the majority of the European
%    languages, that \babel\ from the very beginning developed
%    the tradition of making the |"| character active so as to perform
%    several actions that turned useful with every language.
%    One of these actions consisted in defining the shorthand \verb="|=,
%    that was extensively used in German and in many other languages,
%    in order to insert a discretionary hyphen such that hyphenation
%    would not be precluded in the rest of the word as it happens with
%    the standard \TeX\ command |\-|.
%
%    Meanwhile the \texttt{ec} fonts with the double Cork encoding
%    (thus formerly called the \texttt{dc} fonts) have become more or
%    less standard and are widely used by virtually all Europeans that
%    write languages with many special national characters; by so
%    doing they avoid the use of the |\accent| primitive which would
%    be required with the standard OT1 encoded \texttt{cm} fonts;
%    with such OT1 encoded fonts the primitive command |\accent| is such
%    that hyphenation becomes almost impossible, in any case strongly
%    impeached.
%
%    The T1 encoded fonts contain a special character, named
%    ``compound word mark'', that occupies slot 23 (or |'27| or |"17|
%    in the font scheme and may be input with the sequence |^^W|.
%    Up to now, apparently, this special character has never been used
%    in a practical way for typesetting languages rich of compound
%    words; moreover it has never been inserted in the hyphenation pattern
%    files of any language. Beccari modified his pattern file
%    \file{ithyph.tex v4.8b} for Italian so as to contain five new
%    patterns that involve |^^W|, and he tried to give the
%    \babel\ active character |"| a new shorthand definition,
%    so as to allow the insertion of the ``compound word mark'' in the
%    proper place within any word where two semantic fragments join
%    up. With such facility for marking the compound word boundaries,
%    etymological hyphenation becomes possible even if the patterns
%    know nothing about etymology (but the typesetter hopefully
%    does!).
%
%    \subsubsection{The current solution}
%
%    Even this solution proved to be inconvenient on certain *NIX
%    platforms, so Beccari resorted to another approach that uses the
%    \babel\ active character |"| and relies on the category
%    code of the character that follows |"|.
%
% \changes{italian-1.2n}{2000/02/02}{Completely new etymological
%    hyphenation facility}
% \changes{italian-1.3g}{2014/01/22}{The active double straight
%    quote conflicts with other packages; set as an optional facility.}
%    Instead of a boolean switch we use a private counter so as to check
%    at |\begin{document}| if this facility has to be activated. The default
%    value is zero; anything different from zero means that the facility
%    has to be activated; this is done with command |\setactivedoublequote|
%    to be issued before |\begin{document}|
%
%    \begin{macrocode}
\newcount\it@doublequoteactive \it@doublequoteactive=\z@
\def\setactivedoublequote{\it@doublequoteactive=\@ne}
{\catcode`"=12 \global\let\it@doublequote"}
{\catcode`"=13 \global\let\it@@dqactive"}
\AtBeginDocument{%
  \unless\ifnum\it@doublequoteactive=\z@
  \initiate@active@char{"}%
  \addto\extrasitalian{\bbl@activate{"}\languageshorthands{italian}}%
%    \end{macrocode}
%    \begin{macro}{\it@cwm}
%    The active character |"| is now defined for language |italian| so
%    as to perform different actions in math mode compared to text
%    mode; specifically in math mode a double quote is inserted so as
%    to produce a double prime sign, while in text mode the temporary
%    macro |\it@next| is defined so as to defer any further action
%    until the next token category code has been tested.
%    \begin{macrocode}
  \declare@shorthand{italian}{"}{%
    \ifmmode
      \def\it@next{''}%
    \else
      \def\it@next{\futurelet\it@temp\it@cwm}%
    \fi
    \it@next
  }%
\fi
%    \end{macrocode}
% The following statement must be conditionally executed after the above
% modification of the |\extraasitalian| list; in facts at the ``begin
% document'' execution the main language has already been set without
% the above modifications; therefore nothing takes place unless the
% Italian main language is selected again with the explicit command
% |\selectlanguage| without this trick the active double quotes would
% remain inactive; of course |\languagename| contains the string |italian|
% if this language was the main one; by testing this string, the suitable
% command may be issued again with the new settings and the double quotes
% become really active. Thanks to Davide Liessi for reporting this bug.
%    \begin{macrocode}
\ifdefstring{\languagename}{italian}{\selectlanguage{italian}}{\relax}
}%
%    \end{macrocode}
%    \begin{macro}{\it@cwm}
%    The \cs{it@next} service control sequence is such that upon its
%    execution a temporary variable \cs{it@temp} is made equivalent to
%    the next token in the input list without actually removing it.
%    Such temporary token is then tested by the macro \cs{it@cwm}
%      and if it is found to be a letter token (cathode=11), then it
%      introduces a compound word separator control sequence
%      \cs{it@allowhyphens} whose expansion introduces a discretionary
%      hyphen and an unbreakable zero space;
%    otherwise the token is not a letter; then it is therefore
%      tested against \verb=|=$_{12}$: if so a compound word separator
%      is inserted and the \verb=|= token is removed;
%    otherwise two other tests are performed to see if guillemets
%      have to be inserted, and in case a suitable intelligent
%      guillemet macro is introduced that gobbles unwanted leading
%      or trailing spaces; 
%    otherwise a test is made to see if the next char is a slash
%      character, and in case a special discretionary break is inserted
%      such as to maintain the slash while allowing the hyphenation
%      of both words before and after the slash;
%    otherwise another test is performed to see if another
%      double quote sign follows: in this case a double open quote
%      mark is inserted;
%    otherwise another test is made to see if a connecting hyphen char
%      follows, and in this case the hyphen char is substituted with
%      a discretionary break that allows hyphenation of both words
%      before and after the hyphen char;
%    otherwise nothing is done.
%
%    The double quote shorthand for inserting a double open quote sign
%    is useful for people who are inputting Italian text by means of
%    an Italian keyboard which unfortunately misses the grave or
%    backtick key.
%    The shorthand |""| becomes equivalent to |``| for inserting
%    raised open high double quotes.
%    \begin{macrocode}
\def\it@@cwm{\bbl@allowhyphens\discretionary{-}{}{}\bbl@allowhyphens}%
\def\it@@slash{\bbl@allowhyphens\discretionary{/}{}{/}\bbl@allowhyphens}%
\def\it@@trattino{\bbl@allowhyphens\discretionary{-}{}{-}\bbl@allowhyphens}%
\def\it@@ocap#1{\it@ocap}\def\it@@ccap#1{\it@ccap}%
\DeclareRobustCommand*{\it@cwm}{\let\it@@next\it@doublequote
\ifcat\noexpand\it@temp a%
    \def\it@@next{\it@@cwm}%
\else
    \if\noexpand\it@temp \string|%
        \def\it@@next{\it@@cwm\@gobble}%
    \else
        \if\noexpand\it@temp \string<%
            \def\it@@next{\it@@ocap}%
        \else
            \if\noexpand\it@temp \string>%
                \def\it@@next{\it@@ccap}%
            \else
                \if\noexpand\it@temp\string/%
                    \def\it@@next{\it@@slash\@gobble}%
                \else
                    \ifcat\noexpand\it@temp\noexpand\it@@dqactive
                        \def\it@@next{``\@gobble}%
                    \else
                        \if\noexpand\it@temp\string-%
                            \def\it@@next{\it@@trattino\@gobble}%
                        \fi
                    \fi
                \fi
            \fi
        \fi
    \fi
\fi
\it@@next}%
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%
%
%   \begin{sloppypar}
%    By this definition of |"| if one types |macro"istruzione| the
%    possible break points become \textsf{ma-cro-istru-zio-ne}, while
%    without  the |"| mark they would be \textsf{ma-croi-stru-zio-ne},
%    according to the phonetic rules such that the |macro| prefix is
%    not taken as a unit.
%    A chemical name such as \texttt{des"clor"fenir"amina"cloridrato}
%    is breakable as \textsf{des-clor-fe-nir-ami-na-clo-ri-dra-to}
%    instead of \textsf{de-sclor-fe-ni-ra-mi-na-\dots}
%
%    In other language description files a shorthand is defined so as
%    to allow a break point without actually inserting any hyphen
%    sign; examples are given such as \mbox{entrada/salida}; actually
%    if one wants to allow a breakpoint after the slash, it is much
%    clearer to type |\slash| instead of |/| and \LaTeX\ does
%    everything by itself; here the shorthand |"/| was introduced to
%    stand for |\slash| so that one can type |input"/output| and allow
%    a line break after the slash.
%    This shorthand works only for the slash, since in Italian such
%    constructs are extremely rare.
%   \end{sloppypar}
%
%    Attention: the expansion of |"| takes place before the actual
%    expansion of OT1 or T1 accented sequences such as |\`{a}|;
%    therefore this etymological hyphenation facility works as it
%    should only when the semantic word fragments \textit{do not
%    start} with an accented letter; this in Italian is always
%    avoidable, because compulsory accents fall only on the last
%    vowel, but it may be necessary to mark a compound word where one
%    or more components come from a foreign language and contain
%    diacritical marks according to the spelling rules of that
%    language. In this case the special shorthand \verb!"|! may be
%    used that performs exactly as |"| normally does, except that the
%    \verb!|! sign is removed from the token input list:
%    \verb!kilo"|\"orsted! gets hyphenated as
%    \texttt{ki-lo-\"or-sted}; but also 
%    \texttt{kilo\string"\string|\"orsted} gets hyphenated correctly
%    as \texttt{ki-lo-\"or-sted} The \verb="|= macro is necessary
%    because, even with a suitable option specified to the |inputenc|
%    package, the letter `\"o' does not have category code 11, as the ASCII
%    letters do, because of the LICR (LaTeX Internal Character Representation),
%    i.e. the set of intermediate macros that have to be expanded
%    in order to fetch the proper glyph in the output font.
%
%    \changes{italian-1.2l}{1999/04/05}{Added useful macros for
%    fulfilling ISO 31/XI regulations}
%
%   \subsection{Facilities required by the ISO 31/XI regulations}
%    The ISO 31/XI regulations require that units of measure are
%    typeset in upright font in both math and text, and
%    that in text mode they are separated from the  numerical
%    indication of the measure with an unbreakable (thin) space.
%    The command |\unit| that was defined for achieving this
%    goal happened to conflict with the homonymous command defined by the
%    |units.sty| package; we therefore need to test if that package
%    has already been loaded so as to avoid conflicts; we assume that
%    if the user loads that package, s/he wants to use that package
%    facilities and command syntax.
%    
%    Actually there are around several packages that help to typeset 
%    units of measure in the proper way; besides |units.sty| there are also 
%    |SIunits| and |siunitx.sty|; the latter nowadays offers the best
%    performances in this domain. Therefore we keep controlling the
%    possibility that |units.sty| has been loaded just for backwards
%    compatibility, but we must do the same with |SIunits| and |siunitx.sty|.
%    In order to avoid the necessity o loading packages in a certain order,
%    we delay the test until |\begin{document}|.
%
%    The same ISO regulations require also that super and subscripts
%    (apices and pedices) are in upright font, \emph{not in math
%    italics}, when they represent ``adjectives'' or appositions to
%    mathematical or physical variables that do not represent
%    countable or measurable entities: for example,
%    $V_{\mathrm{max}}$ or $V_{\mathrm{rms}}$ for a maximum voltage or a root
%    mean square voltage, compared to $V_i$  or $V_T$ as the $i$-th
%    voltage in a set, or a voltage that depends on the thermodynamic
%    temperature $T$. See \cite{Becc2} for a complete description of
%    the ISO regulations in connection with typesetting.
%
%    More rarely it happens to use superscripts that are not
%    mathematical variables, such as the notation
%    $\mathbf{A}^{\!\mathrm{T}}$ to denote the transpose of matrix
%    $\mathbf{A}$; text superscripts are useful also as ordinals or
%    in old fashioned abbreviations in text mode; for example the
%    feminine ordinal $1^{\mathrm{a}}$ or the  old fashioned obsolete
%    abbreviation F$^{\mathrm{lli}}$ for \mbox{Fratelli} in company
%    names (compare with ``Bros.'' for \underline{Bro}ther\underline{s}
%    in American English); text subscripts are mostly used in logos.
%
%    \begin{macro}{\unit}
%    \begin{macro}{\ap}
%    \begin{macro}{\ped}
%    \begin{macro}{\setISOcompliance}
%    First we define the new (internal) commands |\bbl@unit|, |\bbl@ap|,
%    and |\bbl@ped| as robust ones.
% \changes{italian-1.3}{2013/09/27}{Added testing to avoid conflicts
%     with the units.sty and  siunitx.sty packages}
% \changes{italian-1.3g}{2014/01/22}{Besides controlling conflicts with
%    units, siunitx, this facility is deactivated by default, and activated
%    only if the user wants to}
%    This facility is deactivated by default according to the contents of
%    an internal counter and the setting of the activation command by the
%    user; commands for apices and pedices remain available in any case.
%    \begin{macrocode}
\newcount\it@ISOcompliance \it@ISOcompliance=\z@
\def\setISOcompliance{\it@ISOcompliance=\@ne}
\AtBeginDocument{\unless\ifnum\it@ISOcompliance=\z@%
\def\activate@it@unit{\DeclareRobustCommand*{\bbl@it@unit}[1]{%
    \textormath{\,\textup{##1}}{\,\mathrm{##1}}}}
\@ifpackageloaded{units}{}{\@ifpackageloaded{siunitx}{}{%
  \@ifpackageloaded{SIunits}{}{%
  \activate@it@unit\addto\extrasitalian{%
    \babel@save\unit\let\unit\bbl@it@unit}%
  }}}\ifcsstring{bbl@main@language}{italian}{\selectlanguage{italian}}{}%
\fi}
\DeclareRobustCommand*{\bbl@it@ap}[1]{%
  \textormath{\textsuperscript{#1}}{^{\mathrm{#1}}}}%
\DeclareRobustCommand*{\bbl@it@ped}[1]{%
  \textormath{$_{\mbox{\fontsize\sf@size\z@
        \selectfont#1}}$}{_\mathrm{#1}}}%
%    \end{macrocode}
%    Then we can use |\let| to define the user level commands, but in
%    case the macros already have a different meaning before entering
%    in Italian mode typesetting, we first save their meaning so
%    as to restore them on exit.
%    \begin{macrocode}
\addto\extrasitalian{%
  \babel@save\ap\let\ap\bbl@it@ap
  \babel@save\ped\let\ped\bbl@it@ped
  }%
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%    \end{macro}
%    \end{macro}
%
% \subsection{Intelligent comma}\label{ssec:comma}
%
%    We need to perform some tests that require some
%    smart control-sequence handling; therefore we call the |etoolbox|
%    package that allows us more testing functionality. There are no problems
%    with this package that can be invoked also by other ones before or
%    after |babel| is called; the |\RequirePackage| mechanism is sufficiently
%    smart to avoid reloading the same package more than once. But we
%    have to delay this call, because |italian.ldf| is being read while
%    processing the options passed to |babel|, and while options are being
%    scanned and processed it is forbidden to load packages; we
%    delay it at the end of processing the |babel| package itself.
%    \begin{macrocode}
\AtEndOfPackage{\RequirePackage{etoolbox}}
%    \end{macrocode}
%
%    \begin{macro}{\IntelligentComma}
%    \begin{macro}{\NoIntellgentComma}
%    This feature is optional, in the sense that it is necessary to issue
%    a specific command to activate it; actually this functionality is activated
%    or, respectively, deactivated with the self explanatory commands 
%    |\IntelligentComma| and |\NoIntelligentComma|. They operate by setting or
%    resetting  the comma sign as an active character in mathematics.
%    We defer the definition of the commands that turn on and off the intelligent
%    comma feature at the end of the preamble, so as to avoid possible conflicts
%    with other packages. It has already been pointed out that this procedure
%    for setting up the active comma to behave intelligently in math mode,
%    conflicts with the |dcolumn| package; therefore we assume these commands
%    are defined when the final user typesets a document, but they will be
%    possibly defined only at the end of the preamble when it will be known
%    if the |dcolumn| package has been loaded. We do the same if packages
%    |icomma| or |ncccomma| have been loaded, since that assumes that the user
%    wants to use their functionality, not the functionality of this package.
%
%    We need a command to set the comma as an active charter only in math mode;
%    the special |\mathcode| that classifies an active character in math is the
%    hexadecimal value |"8000|. By default we set the punctuation
%    type of comma, but we let |\IntelligentComma| and |\NoIntelligentComma|
%    to |\relax| so that their use is forbidden when one of the named packages
%    is loaded. In this way all known conflicts are avoided; should the user
%    find out other conflicts, s/he is kindly required to notify it to the
%    maintainer.
%    \begin{macrocode}
\AtEndOfPackage{\AtEndPreamble{%
\newcommand*\IntelligentComma{\mathcode`\,=\string"8000}% Active comma
\newcommand*\NoIntelligentComma{\mathcode`\,=\string"613B}% Punctuation comma
\@ifpackageloaded{icomma}{\let\IntelligentComma\relax
  \let\NoIntelligentComma\relax}{%
  \@ifpackageloaded{ncccomma}{\let\IntelligentComma\relax
  \let\NoIntelligentComma\relax}{%
    \@ifpackageloaded{dcolumn}{\let\IntelligentComma\relax
      \let\NoIntelligentComma\relax}{%
      \@ifpackageloaded{polyglossia}{%
        \ifcsstring{xpg@main@language}{english}{\relax}{%
          \mathcode`\,=\string"613B}
      }{%
        \ifcsstring{languagename}{english}{\relax}{%
          \mathcode`\,=\string"613B}
      }%
  }}}%
}}
%    \end{macrocode}
%    These commands are defined only in the |babel| support for the Italian
%    language (this file) and are not defined in the corresponding |polyglossia|
%    support for the language.
%    In order to have this functionality work properly with pdfLaTeX,
%    XeLaTeX, and LuaLaTeX, it is necessary to discover which engine
%    is being used, or better, which language handling package is
%    being used: |babel| or |polyglossia|? Let us remember that testing
%    the actual engine, as it would be possible with package |iftex|,
%    does not tell the whole truth, because LuaLaTeX and XeLaTeX  behave
%    in a similar way for what concerns language handling since they can
%    use both |babel| and |polyglossia| (obviously not at the same time);
%    so the use of |babel| or |polyglossia| is the real discriminant factor,
%    not the typesetting engine.
%
%    \begin{macro}{\virgola}
%    \begin{macro}{\virgoladecimale}
%    We need two kinds of comma, one that is a decimal separator, and 
%    a second one that is a punctuation mark.
%    \begin{macrocode}
 \DeclareMathSymbol{\virgola}{\mathpunct}{letters}{"3B}
 \DeclareMathSymbol{\virgoladecimale}{\mathord}{letters}{"3B}
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%
% \changes{italian-1.3a}{2013/10/02}{Corrected the bug of the intelligent
%     comma when used within the AMS alignment environments}
%
%    Math comma activation is done only after the preamble has
%    been completed, that is after the |\begin{document}| statement has been
%    completely executed. Now we must give a definition to the active comma:
%    probably it is not necessary to pass through an intermediate robust
%    command, but certainly it is not wrong to do it.
%    \begin{macrocode}
\DeclareRobustCommand*\it@comma@def{\futurelet\let@token\@@math@comma}%
{\catcode `,=\active \gdef,{\it@comma@def}}%
%    \end{macrocode}
%    The real work shall be performed by |\it@comma@def|. In facts the
%    above macro stores the token that immediately follows |\@@math@comma|
%    into a temporary control sequence that behaves as an implicit character
%    if that token is a single character, even a space, or behaves as
%    an alias of a control sequence otherwise. Actually at the end of the
%    preamble this macro shall be |\let| to be an alias for the real 
%   |\@math@comma|.
%
%    Is is important to remark that |\@math@comma| must be a command that
%    does not require arguments; this makes it robust when it is followed
%    by other characters that may play special r\^oles within the arguments
%    of other macros or environments. Matter of fact the first version 
%    of this file in version 1.3 did accept an argument; and the result was
%    that the active comma would ``eat up'' the |&| in vertical math
%    alignments  and very nasty errors took place, especially within the
%    |amsmath| defined ones. This macro |\@@math@comma| without arguments
%    does not do any harm to the AMS environments and the actual intelligent
%    comma work shall be executed by other macros.
%
%    At this point the situation may become complicated:  the comma character
%    in the input file may be followed by a real digit, by an analphabetic
%    character of category 12 (other character), by an implicit digit, by a
%    macro defined to be a digit, by a macro that is not defined to be a
%    digit, by a special character (for example a closed brace, an alignment
%    command, et cetera); therefore it is necessary to distinguish all these
%    situations; remember that an implicit digit cannot be used as a real
%    digit, and a macro gets expanded when used with any |\if| clause, unless
%    it is a |\ifx| one, or is prefixed with |noexpand|. The tests that are
%    going to be made are therefore of different kinds, according to this
%    scheme:
%    \begin{itemize}
%    \item 
%    the |\let@token| is tested against an asterisk to see it it is of
%    category 12; this is true if the token is a real digit, or an implicit
%    digit, or an analphabetic character;
%    \begin{itemize}
%    \item 
%    an implicit digit is represented by a control sequence; so we
%    first check this feature; 
%    \item 
%    if it is a control sequence, we have to test its nature of a
%    digit by testing if it represented one of the ten digits; 
%    \item otherwise it is an analphabetic character.
%    \end{itemize}
%    \item 
%    otherwise the |\let@token| is a special character or a
%    macro/command; 
%    \item 
%    a test is made to see if it is a macro; in this case we check
%    if has been defined to be a digit,
%    \item 
%    it is not a macro, it must be some other kind of token for
%    example a space or another special character.
%    \end{itemize}
%
%    Notice that if the token is a macro, we do not test if it is defined
%    to be a single digit or a string made up of more digits and/or other
%    charters. If the macro represents one digit the test is correct,
%    otherwise funny results may take place. For this reason it is always
%    better to prefix any macro with a space, whatever its definition might
%    be; if the macro represents a parameter defined to have a variable
%    value in the range 0--9, then it may represent the fractional part of
%    a (short) decimal value, and it is correct to avoid prefixing it with a
%    space; but the user is warned not to make use of numeric strings in
%    the definition of parameters, unless he knows what he is doing.
%    The user may rather use a balanced brace comma group |{,}| in the input file
%    so that the macro will not be considered by the expansion of the
%    active comma. For example if |\x| is defined to be the numerical
%    string |89|, the source input |$2{,}\x$| will be correctly typeset
%    as 2,89; the input \verb*!$2, \x$! will be typeset as 2,\,89 (with
%    an unbreakable thin space after the comma) while |$2,\x$| will be
%    typeset as 29,89, obviously wrong.
%
%    So first we test if the comma must act intelligently; if the counter
%    |\Virgola| contains zero, we assume that the comma must always perform
%    as a punctuation mark; but if we want to distinguish if it must behave
%    as a decimal separator, we have to perform more delicate tests; this
%    latter task is demanded to other macros with arguments |\@math@@comma|
%    and |\@@math@@comma|. In order to make the various tests robust we
%    have to resort to the usual trick of the auxiliary macros |\@firstoftwo|
%    and |\@secondoftwo| and various |\expandafter| commands so as to be
%    sure that every |\if| clause is correctly exited without leaving any
%    trace behind.
%    \begin{macrocode}
\DeclareRobustCommand*\@math@comma{%
 \ifcat\noexpand\let@token*%
    \expandafter\@firstoftwo
 \else
    \expandafter\@secondoftwo
 \fi{%  \let@token is of  category 12
      \@math@@comma
    }{% test if \let@token is a macro
       \ifcat\noexpand\let@token\noexpand\relax
          \expandafter\@firstoftwo
       \else
          \expandafter\@secondoftwo
       \fi{% it is a macro 
             \@@math@@comma
          }{% it is something else. 
             \virgola
          }
    }
}
%    \end{macrocode}
%
%    In particular this macro must test if the argument has category
%    code 12, that is ``other character'', not a letter, nor other
%    special signs, as |&| for example. In case the category code is
%    not 12, the comma must act as a punctuation mark; but if it is,
%    it might be a digit, or another character, an asterisk, for example;
%    so we have to test its digit nature; the simplest that was found
%    to test if a token is a digit, is to test its ASCII code against
%    the ASCII codes of `0' (zero) and `9'.
%    The typesetting engines give the backtick, |`|, the property that
%    when a number is required, it yields the ASCII code if the following
%    token in an explicit character or a macro argument; this is why we
%    can't use the temporary implicit token we just tested, but we must
%    examine the first non blank token that follows the |\@math@@comma|
%    macro. Only if the token is a digit, we use the decimal comma,
%    otherwise the punctuation mark. This is therefore the definition of
%    the |\@math@@comma| macro which is not that simple, although the testing
%    macros have clear meanings:
%    \begin{macrocode}
\DeclareRobustCommand*\@math@@comma[1]{% argument is certainly of category 12
    \ifcsundef{\expandafter\@gobble\string #1}{% test if it is a real digit
        \ifnumless{`#1}{`0}{\virgola}%
          {\ifnumgreater{`#1}{`9}{\virgola}%
             {\virgoladecimale}}%
    }{% it's an implicit character of category 12
      \let\@tempVirgola\virgola
      \@tfor\@tempCifra:=0123456789\do{%
        \expandafter\if\@tempCifra#1\let\@tempVirgola\virgoladecimale
        \@break@tfor\fi}\@tempVirgola
    }#1}
    
\DeclareRobustCommand*\@@math@@comma[1]{% argument is a macro
   \let\@tempVirgola\virgola
   \@tfor\@tempCifra:=0123456789\do{%
   \if\@tempCifra#1\let\@tempVirgola\virgoladecimale
   \@break@tfor\fi}\@tempVirgola#1
}
%    \end{macrocode}
%    The service macros |\ifcsundef|, |\ifnumless|, and |\ifnumgreater| are
%    provided by the |etoolbox| package, that shall be read at most at the
%    end of the |babel| package processing; therefore we must delay the code
%    at ``end preamble'' time, since only at that time
%    it will be known if the main language is English, or any other one.
%    This is why we have to perform such a baroque definition as the
%    following one:
%    \begin{macrocode}
\AtEndOfPackage{\AtEndPreamble{\let\@@math@comma\@math@comma}}
%    \end{macrocode}
%    This intelligent comma definition is pretty intelligent, but it requires
%    some kind of information from the context; this context does not
%    give enough bits of information to this `intelligence' in just one case:
%    when the comma plays the r\^ole of a serial separator in expressions
%    such as $i=1, 2, 3,\dots,\infty$, entered as 
%    \verb*?$i=1, 2, 3,\dots,\infty$?. Only in this case  the comma must
%    be followed by an explicit space; should this space
%    be absent the macro takes the following non blank token as a digit,
%    and since it actually is a digit, it would use the decimal comma, which
%    would be wrong. The control sequences |\dots| and |\infty| are
%    tested to see if they are undefined, and since they are defined and
%    do not represent digits, the macro inserts a punctuation mark,
%    instead of a decimal separator.
%
%    Notice that this macro may appear to be inconsistent with the contents
%    of a language description file. I don't agree: matter of facts even
%    math is part of typesetting a text in a certain language.
%    Does this set of macros influence other language description files?
%    May be, but I think that the clever use of macros |\IntelligentComma|
%    and |\NoIntellingentComma| may solve any interference; they allow to
%    use the proper mark even if the Italian language is not the main
%    language, the important point is to turn the switch on and/or off.
%    By default it is off, so there should not be any interference even
%    with legacy documents typeset in Italian.
%
%    Notice that there are other packages that contain facilities for
%    using the decimal comma as the correct decimal separator; for
%    example |SIunitx| defines a command |\num| that not only correctly
%    spaces the decimal separator, but also can change the input glyph
%    with another one, so that it is possible to copy and paste numbers
%    from texts in English (with the decimal point)  and paste them
%    into the argument of the |\num| macro in an Italian document where
%    the decimal point is changed automatically into a decimal comma. Of
%    course |SIunitx| does much more than that; if it's being loaded,
%    then the default |\NoIntelligentComma| declaration disables the
%    functionality defined in this language description file and the
%    user can do what he desires with the many functionalities of that
%    package.
%
%    Apparently a conflict with the active comma arises with the D column
%    defined by the |dcolomn| package. Disabling the ``Italian'' active comma
%    allows the D column operate correctly. Thanks to Giuseppe Toscano for
%    telling me about this conflict.
%    \end{macro}
%    \end{macro}
%
% \subsection*{Accents}\label{s:itkbd}
%    Most of the other language description files introduce a number
%    of shorthands for inserting accents and other language specific
%    diacritical marks in a more comfortable way compared with the
%    lengthy standard \TeX\ conventions. When an Italian keyboard is
%    being used on a Windows based platform, it exhibits such
%    limitations that to my best knowledge no convenient shorthands have been
%    developed; the reason lies in the fact that the Italian keyboard
%    lacks the grave accent (also known as ``backtick''), which is
%    compulsory on all accented vowels,  but, on the
%    opposite, it carries the keys with all the accented \emph{lowercase}
%    vowels \`a, \`e, \'e, \`i, \`o, \`u, bot no \emph{uppercase} accented
%    vowels are directly avalaible from the keyboard; the keyboard lacks also
%    the tie |~| (tilde) key, while the curly braces require pressing three
%    keys simultaneously.
%
%    The best solution Italians have found so far is to use a smart
%    editor that accepts shorthand definitions such that, for example,
%    by striking |"(| one gets directly |{| on the screen and the same
%    sign is saved into the \file{.tex} file; the same smart editor
%    should be capable of translating the accented characters into the
%    standard \TeX\ sequences when writing a file to disk (for the
%    sake of file portability), and to transform the standard \TeX\
%    sequences into the corresponding signs when loading a \file{.tex}
%    file from disk to memory. Such smart editors do exist and can be
%    downloaded from the \textsc{ctan} archives.
%
% \changes{italian-1.2p}{2002/07/10}{Removed redefinition of \cs{add@acc} since its
%    functionality has been introduced into the kernel of LaTeX 2001/06/01}
%
%    For what concerns the missing backtick key,
%    which is used also for inputting the open quotes, it must be
%    noticed that the shorthand |""| described above completely solves
%    the problem for \textit{double} raised open quotes; besides this,
%    a single open raised  quote may be input whit the little known
%    \LaTeX\ kernel command |\lq|; according to
%    the traditions of particular publishing houses, since there are
%    no  compulsory regulations on the matter, the guillemets
%    may be used; in this case the T1 font encoding solves the problem
%    by means of its built in ligatures |<<| and |>>|; such ligatures
%    are also available when using OpenType fonts with XeLaTeX and
%    LuaLaTeX, provided they are loaded with the option
%    \texttt{Ligatures = TeX}. But\dots
%
%    \subsection*{\emph{Caporali} or French double quotes}
%    Although the T1 font encoding ligatures solve the problem, there
%    are some circumstances where even the T1 font encoding cannot be
%    used, either because the author\slash typesetter wants to use the
%    OT1 encoding, or because s/he uses a font set that does
%    not comply completely with the T1 font encoding; some virtual
%    fonts, for example, are supposed to implement the double Cork
%    font encoding but actually miss some glyphs; one such virtual
%    font set is given by the \texttt{ae} virtual fonts, because they
%    are supposed to implement such double font encoding by using
%    virtual fonts that map the |CM| fonts to a T1 font scheme; the
%    type~1 PostScript version of the |CM| fonts do exist, therefore
%    one believes to be able of using them with pdfLaTeX; but since
%    the |CM| fonts do not contain the guillemets, neither the |AM|
%    ones do.
%    Since guillemets (in Italian \emph{caporali}) do not exist in
%    any OT1 encoded \texttt{cm} Latin font, their glyphs must be
%    substituted with something else that fakes them.
%
% \changes{italian-1.2q}{2005/02/05}{Redefined the caporali machinery
%     so as to avoid incompatibilities with the slides class, as there
%     are no Cyrillic slides fonts as there are for Latin script}
% \changes{italian-1.3}{2013/09/30}{The slide font fix up is not any
%     more necessary with the new caporali handling method.}
%
%    In the previous versions of this language description file the
%    absent guillemets were faked with other fonts, by taking example
%    from the solution the French had found for their language
%    description file; they would get suitable guillemets from the
%    cyrillic fonts; this solution was good in most cases, except when
%    the ``slides fonts'' were used, because there is no Cyryllic slide
%    font around.
% 
%    This might seem a negligible ``feature'' because the modern classes
%    or extension modules to produce slides mostly avoid the ``old'' fonts
%    for slides created by Leslie Lamport when he made available the macro
%    package LaTeX to the TeX community.
%
%    Since I designed renewed slide fonts extending those 
%    created by Leslie Lamport to the T1 encoding, the Text Companion
%    fonts, and the most frequent ``regular'' and AMS math fonts with the same
%    graphic style and excellent legibility (LXfonts), I thought that
%    this feature is not so negligible. It's true that nowadays nobody
%    should use the old OT1 encoding when typesetting in any language,
%    English included, because independently form the document main
%    language, it is very frequent to quote passages in other languages,
%    or to type foreign proper names of persons or places; nevertheless
%    having in mind a minimum of backwards compatibility and hoping
%    that the deliberate use of OT1 encoding (still necessary to typeset
%    mathematics) is being abandoned, I decided to simplify the previous
%    handling of guillemets.
%
%    Therefore here I will test at ``begin document'' only if the OT1
%    encoding is the default one, while if the T1 encoding is the default
%    one, that the font collection |AE| is not being used; should
%    it be the case, I will substitute the guillemets with the LaTeX
%    special symbols reduced to script size, and I will not try to fake
%    the guillemets with better solutions; evidently if OpenType fonts
%    are being used, nothing is done; so the tests that follow concern
%    only typesetting old documents or the lack of a wiser choice of fonts
%    and their encodings; an info message is issued and output to the
%    |.log| file. 
%
%    \begin{macro}{\LtxSymbCaporali}
%    \begin{macro}{\it@ocap}
%    \begin{macro}{\it@ccap}
%     First the macro |\LtxSymvCaporali| is defined so as to assign a
%     default definition of the faked guillemets: each one of these macro sets
%     actually redefines the control sequences |\it@ocap| and |\it@ccap| that
%     are the ones effectively activated by the shorthands |"<| and |">|. 
%     By default the caporali glyphs are taken from T1-encoded fonts; at
%     the end of the preamble some tests are performed to control if the
%     default fonts contain such glyphs, and in case a different font is chosen.
%    \begin{macrocode}
\def\LtxSymbCaporali{%
     \DeclareRobustCommand*{\it@ocap}{\mbox{%
        \fontencoding{U}\fontfamily{lasy}\selectfont(\kern-0.20em(}%
        \ignorespaces}%
     \DeclareRobustCommand*{\it@ccap}{\ifdim\lastskip>\z@\unskip\fi
     \mbox{%
        \fontencoding{U}\fontfamily{lasy}\selectfont)\kern-0.20em)}}%
}%
\def\T@unoCaporali{\DeclareRobustCommand*{\it@ocap}{<<\ignorespaces}%
     \DeclareRobustCommand*{\it@ccap}{\ifdim\lastskip>\z@\unskip\fi>>}}%
\T@unoCaporali
%    \end{macrocode}
%    Nevertheless a macro for choosing where to get glyphs for real guillemets
%    is offered; the syntax is the following:
%    \begin {flushleft}
%    |\CaporaliFrom|\marg{encoding}\marg{family}\marg{open guill. slot}%
%    \marg{close guill. slot}
%    \end{flushleft}
%    where \meta{encoding} and \meta{family} identify the font family
%    name of that particular encoding from which to get the missing
%    guillemets; \meta{open guill. slot} and \meta{close guill. slot}
%    are the (preferably) decimal slot addresses of the opening and
%    closing guillemets the user wants to use. For example if the 
%    T1-encoded Latin Modern fonts are desired, the specific command
%    should be
%     \begin {flushleft}
%     |\CaporaliFrom{T1}{lmr}{19}{20}|
%     \end{flushleft}
%     These user choices might be necessary for assuring the correct
%     typesetting
%     with fonts that contain the required glyphs and are available
%     also in PostScript form so as to use them directly with {pdfLaTeX},
%     for example.
%    \begin{macrocode}
\def\CaporaliFrom#1#2#3#4{%
  \DeclareFontEncoding{#1}{}{}%
  \DeclareTextCommand{\it@ocap}{T1}{%
    {\fontencoding{#1}\fontfamily{#2}\selectfont\char#3\ignorespaces}}%
  \DeclareTextCommand{\it@ccap}{T1}{\ifdim\lastskip>\z@\unskip\fi%
    {\fontencoding{#1}\fontfamily{#2}\selectfont\char#4}}%
  \DeclareTextCommand{\it@ocap}{OT1}{%
    {\fontencoding{#1}\fontfamily{#2}\selectfont\char#3\ignorespaces}}%
  \DeclareTextCommand{\it@ccap}{OT1}{\ifdim\lastskip>\z@\unskip\fi%
    {\fontencoding{#1}\fontfamily{#2}\selectfont\char#4}}}
%    \end{macrocode}
%    Notice that the above macro is strictly tied to the T1 encoding;
%    it won't do anything if the default encoding is not the T1 one.
%    Therefore if the |AE| font collection is being used it would be
%    good idea to issue the command shown above as an example in order
%    to get the proper guillemets\footnote{Actually the \texttt{AE}
%    fonts should not be used at all; the same results, more or less
%    are obtained by using the Latin Modern ones, that are not virtual
%    fonts and contain the whole T1 font scheme. Nevertheless the faked
%    glyphs are not so bad, so the solution I restored from old versions
%    of the language description file is acceptable}.

%     Then we set a boolean variable and test the default family;
%     if such family has a name that starts with the letters ``ae''
%     then we have no built in guillemets; of course if the AE font family is chosen
%     after the \babel\ package is loaded, the test does not perform as required.
%    \begin{macrocode}
\def\get@ae#1#2#3!{\def\bbl@ae{#1#2}}%
\def\@ifT@one@noCap{\expandafter\get@ae\f@family!%
\def\bbl@temp{ae}\ifx\bbl@ae\bbl@temp\expandafter\@firstoftwo\else
    \expandafter\@secondoftwo\fi}%
%    \end{macrocode}
%    Now we can set some real settings; first we start by testing
%    the encoding; if the encoding is OT1 we set the faked caporali
%    with LaTeX symbols and issue a warning; then we test if the font
%    family is the AE one we set again the faked caporali and issue
%    another warning\footnote{Notice the it is impossible to check
%    if the slots 19 and 20 of the AE fonts are defined by means of
%    the eTeX macro \texttt{\char92iffontchar}, because they are
%    actually defined as black squares!}; otherwise we set the commands
%    valid for the T1 encoding, that work well also with the TeX
%    Ligatures of the OpenType fonts.
%    \begin{macrocode}
\AtBeginDocument{\normalfont\def\bbl@temp{OT1}%
  \ifx\cf@encoding\bbl@temp
    \LtxSymbCaporali
    \GenericWarning{italian.ldf\space}{%
    File italian.ldf warning: \MessageBreak\space\space\space
    With OT1 encoding guillemets are poorly faked\MessageBreak
    \space\space\space
    Use T1 encoding\MessageBreak\space\space\space
    or specify a font with command \string\CaporaliFrom\MessageBreak
    \space\space\space
    See the documentation concerning the babel-italian typesetting
    \MessageBreak\space\space}%
  \else
    \ifx\cf@encoding\bbl@t@one
      \@ifT@one@noCap{%
        \LtxSymbCaporali
        \GenericWarning{italian.ldf\space}{%
        File italian.ldf warning: \MessageBreak\space\space\space
        The AE font collection does not contain the guillemets
        \MessageBreak\space\space\space
        Use the Latin Modern font collection instead
        \MessageBreak\space}
      }%
    {\T@unoCaporali}\fi
  \fi
}
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%    \end{macro}
%
%    \subsection*{Finishing commands}
%    The macro |\ldf@finish| takes care of looking for a
%    configuration file, setting the main language to be switched on
%    at |\begin{document}| and resetting the category code of
%    \texttt{@} to its original value.
% \changes{italian-1.2i}{1996/11/03}{Now use \cs{ldf@finish} to wrap
%    up}
%    \begin{macrocode}
\ldf@finish{italian}%
%    \end{macrocode}
%\iffalse
%</code>
%\fi
%
% \Finale
%%
%% \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         \~}
%%
\endinput
