vincentb1 / fmtcount

Source for LaTeX fmtcount package
11 stars 5 forks source link

\fmtord does not use upperscript letter when available #16

Closed vincentb1 closed 9 years ago

vincentb1 commented 9 years ago

Dear @nlct, Recently @dbitouze reported to me that \fmtord does not use upperscript letters when available. These glyphs are available with the \up command in the frenchb module of babel.

The consequence of this, is that the following will give a different aspect — please get the latest fmtcount before trying it, as I recently made a commit d123fb1b1370f0e1de0cad3c141f5807e907b63a:

\documentclass[french]{minimal}
\usepackage{babel}
\usepackage{fmtcount}
\usepackage{array}
\usepackage[active,tightpage]{preview}
\begin{document}
\begin{preview}
  \begin{tabular}{@{ }l@{ }l@{ }}
    babel&fmtcount\\\hline
    1\ier&\ordinalnum{1}\\
    2\ieme&\ordinalnum{2}\\
  \end{tabular}
\end{preview}
\end{document}

You should get something like this: ecm

vincentb1 commented 9 years ago

Just to make it clear: the question is whether there is a need for all languages to support upper letter, i.e. change definition of \fmtord in fmtcount.sty, rather than change fc-french.def

vincentb1 commented 9 years ago

FYI, I made the PNG picture in my first comment with this command:

/path/to/ghostscript/bin/gswin64c.exe -dBATCH -dNOPAUSE \
               -sOutputFile=ecm.png -sDEVICE=pngalpha \
        -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -dSAFER -r308 \
        -q ecm.pdf

where:

nlct commented 9 years ago

I was wondering if perhaps if would be better for \@ordinalMfrench to use \ier and \ieme instead of using \fmtord, but that might cause compatibility issues.

I recently made a new package called tracklang, which helps track language options. My intention is to use it for all my packages that provide multilingual support to separate each language (or dialect) into a module that can be maintained independently of the main package code. I'd like to do this for fmtcount as well, but I'm not sure of the best approach to do it in a neat, backward-compatible way. That way, there could be a base language module, say, fmtcount-french.ldf with regional modules, such as fmtcount-fr-FR.ldf and fmtcount-fr-BE.ldf. It might also be useful to have utf8 alternatives, say, fmtcount-french-utf8.ldf etc to better support xelatex. It can then be up to each language module to determine which glyphs are supported.

vincentb1 commented 9 years ago

For using \ier and \ieme, that could be done like this to avoid any compatibility issues (code below is not tested):

\ifcsundef{ier}{\fmtord{er}}{\ier}

Concerning tracklang, I do not know the interface, but my feeling is that what we have in fmtcount could be improved. Rather than having macros \@ordinalMfrench and \@ordinalFfrench, it would be better in my opinion to have a single macro \@ordinalfrench to be called with gender (male|female|neutral)+ number (singular|plural)+ case (nominative|accusative|etc…) as input.

Anyway, coming back to the issue itself. What is your opinion: is there any need e.g. in English which is your native language to do something-else than \textsuperscript. Frankly speaking, if I was asked the same question for French, I would be unable to answer. I mean it is certainly better for you to raise the issue on some forum visited by native English speaker.

vincentb1 commented 9 years ago

Or you (@nlct) could direct me to such a forum...

vincentb1 commented 9 years ago

Hello @nlct & @dbitouze,

Coming back to this issue, I think that we could use the \fmtcountsetoptions{fmtord=} with a third value — say up — to mean \up. Currently we have values raise to mean \textsuperscript and level to mean identity. There is also an embrionary code of value user, I think that I am the one who added that thing without completing it — sorry for creating noise. To my recollection the intention was to open to possibility to use a user defined macro passed as another argument for \fmtord to point at.

So I mean that:

\fmtcountsetoptions{fmtord=up}

would let \fmtord to be some \fc@up which would be a copy of the \up provided by babel/frenchb — so we would have it even w/o frenchb.

First question: do you agree on the new key value up.

Next question, should we have the possibility to have this configuration per language. For instance we could do:

\fmtcountsetoptions{fmtord=level,french={fmtord=up}, english={fmtord=raise}}

so that:

Final question: should I remove the embrionary code for user formatting, or should I complete it, and similarly, should there be a possibility to have it per language ?

nlct commented 9 years ago

There's considerable disagreement over whether or not to superscript the ordinal abbreviation in English. I suspect it's a regional thing. Some people insist that the ordinal superscript is a product of word processors, but this isn't the case since I was taught to superscript the end part of abbreviations when I was a child, and that was well before the advent of word processors. (Not just for ordinals, but for other abbreviations, such as eqn or Mr, where the middle part of the word is omitted.) So I think raised ordinals is probably just a British (or maybe Commonwealth) style. fmtcount doesn't actually support US English, as I think they drop the "and" in textual numbers, but I don't know for certain. This is one of the reasons why I think it would be best to separate the language (or regional) support into independent modules, so they can be maintained by someone fluent in the language (or dialect).

Going back to how to implement the superscript (when required), I think \textsuperscript is the best solution. I've never come across anyone who uses superscript-style glyphs for English ordinals. (Although that doesn't mean that no one does.)

I don't mind if you want to restructure the package internals. As long as the current user commands remain backward-compatible it shouldn't be a problem. (Even if they are superseded by newer user commands.)

With regard to the tracklang interface, basically the main fmtcount.sty file would have something like:

\RequirePackage{tracklang}

\AnyTrackedLanguages {% \ForEachTrackedDialect{\this@dialect}{% \IfTrackedLanguageFileExists{\this@dialect}% {fmtcount-}% prefix {.ldf}% suffix {% \PackageInfo{fmtcount}{Loading fmtcount-\CurrentTrackedTag.ldf' for language\this@dialect'}% \input{fmtcount-\CurrentTrackedTag.ldf}% \InputIfFileExists{fmtcount-\CurrentTrackedLanguage.ldf}% {}% {% \PackageWarning{fmtcount}{No support for language \CurrentTrackedLanguage'}% }% }% {% \PackageWarning{fmtcount}% {No support for language\this@dialect'}% }% }% } {% no tracked languages, set up defaults here }

(or substitute ".ldf" with ".def")

The files containing the language or region dependent information should then be saved with the file name in the form fmtcount-.ldf or fmtcount--.ldf. For example, "fmtcount-en-GB.ldf", "fmtcount-fr-BE.ldf" or "fmtcount-italian.ldf". The regional files could load the base language file (for example, "fmtcount-french.ldf") and make the appropriate regional changes.

The tracklang package checks for babel, translator, polyglossia and ngerman, and sets the language information accordingly. It can also, in some instances, detect the region in the case of babel or translator, but not for polyglossia or ngerman, however it can pick up any language settings passed as a package option, so fmtcount.sty could have something like:

\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{tracklang}}

before it loads tracklang. (Which means the language options can also be passed through the document class option list, provided the document class uses the standard option mechanism.)

It might also be an idea to provide UTF-8 support for language strings containing diacritics to make it work better with XeLaTeX. For example, for French, there could be two files called, say, "fmtcount-french-strings.ldf", which is encoding-independent, so it contains:

\newcommand*{\@@unitstringfrench}[1]{% \noexpand\fc@case \ifcase#1 % z\'ero% \or un% \or deux% \or trois% \or quatre% \or cinq% \or six% \or sept% \or huit% \or neuf% \fi \noexpand\@nil }

and also "fmtcount-french-strings-utf8.ldf", which uses é instead of \'e (and is saved as a UTF-8 file). Determining which of the files to load is (I think) just a matter of testing if fontspec has been loaded or if \inputencoding exists and expands to "utf8".

Perhaps setting the options for particular languages could be done through a command that takes the language as the first argument and the options as the second argument and leave it up to the language module to determine if the provided options are valid.

vincentb1 commented 9 years ago

Dear Daniel (@dflipo),

We are intending to align the behaviour of fmtcount on that of frenchb as far as ordinal finals (like er in 1er) are concerned. Currently fmtcount does not use any of \ier, \iere or \ieme, etc… but a plain \textsuperscript{er}, \textsuperscript{re} or \texsuperscript{e}. Indeed a macro \fmtord defined as \texsuperscript is used instead of the latter.

I think that rather than using \ier, \iere and \ieme, it would be more elegant to use \fmtord{er}, \fmtord{ere} or \fmtord{e}, with \fmtord defined as \up. The reason for that is some option can select what \fmtord does, so that the user can have other behaviours than the default one.

Now, the question is the following: do you intend to make some separate package just to provide the definition of \up, so fmtcount.sty coud do some \RequirePackage of it. Currently \up is only supplied by frenchb.def, so it would be a pity to duplicate your code in fmtcount.sty

VBR,     Vincent.

dflipo commented 9 years ago

Vincent Belaïche a écrit le 22/11/2014 00:01 :

We are intending to align the behaviour of |fmtcount| on that of |frenchb| as far as ordinal finals (like |er| in 1er) are concerned. Currently |fmtcount| does not use any of |\ier|, |\iere| or |\ieme|, etc… but a plain |\textsuperscript{er}|, |\textsuperscript{re}| or |\texsuperscript{e}|. Indeed a macro |\fmtord| defined as |\texsuperscript| is used instead of the latter.

I think that rather than using |\ier|, |\iere| and |\ieme|, it would be more elegant to use |\fmtord{er}|, |\fmtord{ere}| or |\fmtord{e}|, with |\fmtord| defined as |\up|. The reason for that is some option can select what |\fmtord| does, so that the user can have other behaviours than the default one.

Now, the question is the following: do you intend to make some separate package just to provide the definition of |\up|, so |fmtcount.sty| coud do some |\RequirePackage| of it. Currently |\up| is only supplied by |frenchb.def|, so it would be a pity to duplicate your code in |fmtcount.sty|

Hi Vincent,

Sorry, I do not intend to split frenchb into pieces for separate use; specially regarding the superscripts part, \up (actually \fup) is not worth a package: scaling down and raising standard letters to make superscripts is just a poor man's solution (strokes are too thin anyway), the only way to go is to use fonts which have /real/ superscripts (and /real/ small caps, same problem occurs when scaling down capitals).

If you admit that LuaTeX/XeTeX and OTF fonts are the (near) future of TeX, considering that more and more OTF fonts have superscripts and small caps built-in, fmtcount could just rely on \texsuperscript and make sure the realsuperscript package is loaded in order to get built-in superscripts instead of faked ones whenever possible.

One more point: fmtcount could check \AtBeginDocument whether \up is defined or not, and decide to use \up instead of \texsuperscript to insure the same output for "1\ier" (frenchb) and \fmtord{1} (fmtcount).

IMHO, superscripts should look the same for the whole document regardless the current language, only the decision to print ordinals as superscripts or as normal letters should be language dependent.

Best wishes,

Daniel Flipo

vincentb1 commented 9 years ago

Hello,

Yes I do admit that XeTeX (I do not know LuaTeX, so I cannot tell) is the near future of TeX.

I tried what you wrote (after some search it seems that the package that you point at is realscripts and not realsuperscript), with the following code compiled with xelatex:

\documentclass[french]{minimal}
\usepackage{babel}
\usepackage{realscripts}
\usepackage{fmtcount}
\usepackage{array}
\usepackage[active,tightpage]{preview}
\begin{document}
\begin{preview}
  \begin{tabular}{@{ }l@{ }l@{ }}
    babel&fmtcount\\\hline
    1\ier&\ordinalnum{1}\\
    2\ieme&\ordinalnum{2}\\
  \end{tabular}
\end{preview}
\end{document}

Here is what I get:

ecm

It seems that fmtcount and babel still do not look the same. I must even say that I cannot see much difference between this picture and that of my initial post. I tried also to insert this :

\let\textsuperscript=\realsuperscript

immediately after the \begin{document}, or to place \usepackage{realscripts} before \usepackage{babel} (but I must say that I am not sure whether babel is right with xelatex, shouldn't I replace it by polyglossia — but then, there aren't any longer \ier or \ieme defined, even with a \setmainlanguage{french} placed after \begin{document} and before using \ier or \ieme.

So, I cannot really understand what \up is doing. I had understood from Denis's (@dbitouze) email that the intention was to use glyphs of real superscripts. Now from your (@dflipo's) email I understood that actually you are using these glyphs only if there are there, and do the same job as \textsuperscript otherwise, but from my experiment \up and \textsuperscript do not do the same job even when:

Sorry for missing the point…

dflipo commented 9 years ago

Vincent Belaïche a écrit le 23/11/2014 23:47 :

  • I have |\usepackage{realscripts}|
  • I compile with xelatex
  • I do |\let\textsuperscript=\realsuperscript| immediately after the |\begin{document}|

This third point is useless…

Sorry for missing the point…

You need a font that has superscripts built-in (/not/ the default CMR or LMR fonts)! Try this:

\documentclass[french]{minimal} \usepackage{fontspec} \setmainfont{Erewhon} % Free Utopia like font \usepackage{realscripts} \usepackage{babel} \usepackage{fmtcount} \usepackage{array} \usepackage[active,tightpage]{preview} \begin{document} \begin{preview} \begin{tabular}{@{ }l@{ }l@{ }l@{ }} babel&fmtcount&textsup.\hline 1\ier&\ordinalnum{1}&1\textsuperscript{er}\ 2\ieme&\ordinalnum{2}&2\textsuperscript{e}\ \end{tabular} \end{preview} \end{document}

Best regards,

Daniel Flipo

vincentb1 commented 9 years ago

Hello Daniel,

I have tried to compile your example (recalled below) with Erewhon:

\documentclass[french]{minimal}
\usepackage{fontspec}
\setmainfont{Erewhon} % Free Utopia like font
\usepackage{realscripts}
\usepackage{babel}
\usepackage{fmtcount}
\usepackage{array}
\usepackage[active,tightpage]{preview}
\begin{document}
\begin{preview}
   \begin{tabular}{@{ }l@{ }l@{ }l@{ }}
     babel&fmtcount&textsup.\\\hline
     1\ier&\ordinalnum{1}&1\textsuperscript{er}\\
     2\ieme&\ordinalnum{2}&2\textsuperscript{e}\\
   \end{tabular}
\end{preview}
\end{document}

I have followed the Erewhon instruction from Erewhon README file for MikTeX 2.9. However there seems to be something missing (all the TFM files are there, but xelatex seems to fail to find them...) — MikTeX makes this output:

("C:\Programmes\MiKTeX 2.9\tex\latex\fontspec\fontspec.cfg")))Running miktex-makemf.exe...
miktex-makemf: The Erewhon source file could not be found.

VBR,    Vincent.

PS: FYI, here is the complete log file which I get (I compile with AUCTeX):

Running `XeLaTeX' on `ecm' with ``xelatex -interaction=nonstopmode "\input" "ecm.tex"''
This is XeTeX, Version 3.1415926-2.5-0.9999.3 (MiKTeX 2.9 64-bit)
entering extended mode
LaTeX2e <2011/06/27>
Babel <v3.8m> and hyphenation patterns for english, afrikaans, ancientgreek, ar
abic, armenian, assamese, basque, bengali, bokmal, bulgarian, catalan, coptic, 
croatian, czech, danish, dutch, esperanto, estonian, farsi, finnish, french, ga
lician, german, german-x-2013-05-26, greek, gujarati, hindi, hungarian, iceland
ic, indonesian, interlingua, irish, italian, kannada, kurmanji, latin, latvian,
 lithuanian, malayalam, marathi, mongolian, mongolianlmc, monogreek, ngerman, n
german-x-2013-05-26, nynorsk, oriya, panjabi, pinyin, polish, portuguese, roman
ian, russian, sanskrit, serbian, slovak, slovenian, spanish, swedish, swissgerm
an, tamil, telugu, turkish, turkmen, ukenglish, ukrainian, uppersorbian, usengl
ishmax, welsh, loaded.
(c:\Nos_Programmes\msys\local\projects\fmtcount\ecm.tex
("C:\Programmes\MiKTeX 2.9\tex\latex\base\minimal.cls"
Document Class: minimal 2001/05/25 Standard LaTeX minimal class
) ("C:\Programmes\MiKTeX 2.9\tex\latex\fontspec\fontspec.sty"
("C:\Programmes\MiKTeX 2.9\tex\latex\l3kernel\expl3.sty"
("C:\Programmes\MiKTeX 2.9\tex\latex\l3kernel\expl3-code.tex"
("C:\Programmes\MiKTeX 2.9\tex\latex\misc\etex.sty"))
("C:\Programmes\MiKTeX 2.9\tex\latex\l3kernel\l3xdvipdfmx.def"))
("C:\Programmes\MiKTeX 2.9\tex\latex\l3packages\xparse\xparse.sty")
("C:\Programmes\MiKTeX 2.9\tex\latex\fontspec\fontspec-patches.sty"
("C:\Programmes\MiKTeX 2.9\tex\latex\base\fixltx2e.sty")
*************************************************
* LaTeX warning: "xparse/redefine-command"
* 
* Redefining document command \oldstylenums with arg. spec. 'm' on line 128.
*************************************************
) ("C:\Programmes\MiKTeX 2.9\tex\latex\fontspec\fontspec-xetex.sty"
("C:\Programmes\MiKTeX 2.9\tex\latex\base\fontenc.sty"
("C:\Programmes\MiKTeX 2.9\tex\latex\euenc\eu1enc.def")
("C:\Programmes\MiKTeX 2.9\tex\latex\euenc\eu1lmr.fd"))
("C:\Programmes\MiKTeX 2.9\tex\xelatex\xunicode\xunicode.sty"
("C:\Programmes\MiKTeX 2.9\tex\latex\tipa\t3enc.def"
("C:\Programmes\MiKTeX 2.9\tex\latex\euenc\eu1lmss.fd"))
("C:\Programmes\MiKTeX 2.9\tex\latex\graphics\graphicx.sty"
("C:\Programmes\MiKTeX 2.9\tex\latex\graphics\keyval.sty")
("C:\Programmes\MiKTeX 2.9\tex\latex\graphics\graphics.sty"
("C:\Programmes\MiKTeX 2.9\tex\latex\graphics\trig.sty")
("C:\Programmes\MiKTeX 2.9\tex\latex\00miktex\graphics.cfg")
("C:\Programmes\MiKTeX 2.9\tex\xelatex\xetex-def\xetex.def"))))
("C:\Programmes\MiKTeX 2.9\tex\latex\fontspec\fontspec.cfg")))Running miktex-makemf.exe...
miktex-makemf: The Erewhon source file could not be found.

Running hbf2gf.exe...

hbf2gf (CJK ver. 4.8.3)

Couldn't find `Erewh.cfg'

miktex-maketfm: No creation rule for font Erewhon.
Running miktex-makemf.exe...
miktex-makemf: The Erewhon source file could not be found.

Running hbf2gf.exe...

hbf2gf (CJK ver. 4.8.3)

Couldn't find `Erewh.cfg'

miktex-maketfm: No creation rule for font Erewhon.
Running miktex-makemf.exe...
miktex-makemf: The Erewhon source file could not be found.

Running hbf2gf.exe...

hbf2gf (CJK ver. 4.8.3)

Couldn't find `Erewh.cfg'

miktex-maketfm: No creation rule for font Erewhon.
Running miktex-makemf.exe...
miktex-makemf: The Erewhon source file could not be found.

Running hbf2gf.exe...

hbf2gf (CJK ver. 4.8.3)

Couldn't find `Erewh.cfg'

miktex-maketfm: No creation rule for font Erewhon.
Making B.tfm from "C:\Programmes\MiKTeX 2.9\fonts\source\public\levy-font\B.mf"...
Running miktex-mf.exe...
This is METAFONT, Version 2.718281 (MiKTeX 2.9 64-bit)

(C:\Programmes\MiKTeX 2.9\fonts\source\public\levy-font\B.mf

>> readfrom

! Isolated expression.

<to be read again> 

                   (

l.26 if unknown gen_sigma : readfrom(

                                     "gen_sigma") fi

! Extra tokens will be flushed.

<to be read again> 

                   (

l.26 if unknown gen_sigma : readfrom(

                                     "gen_sigma") fi

>> cmchar

! Isolated expression.

<to be read again> 

                   "Lowercase beta"

l.73 cmchar "Lowercase beta"

                            ;

! Extra tokens will be flushed.

<to be read again> 

                   "Lowercase beta"

l.73 cmchar "Lowercase beta"

                            ;

! Missing argument to beginchar.

<to be read again> 

                   ;

l.74 beginchar("b",dims);

! Missing argument to beginchar.

<to be read again> 

                   ;

l.74 beginchar("b",dims);

>> dims

! Internal quantity `charwd' must receive a known value.

<to be read again> 

                   ;

beginchar->...byte(EXPR0)else:0fi;charwd:=(EXPR1);

                                                  charht:=(EXPR2);chardp:=(E...

<to be read again> 

                   ;

l.74 beginchar("b",dims);

>> this_letter

! Isolated expression.

<to be read again> 

                   ;

l.75 this_letter;

                  penlabels(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15); endchar;

[98]

>> cmchar

! Isolated expression.

<to be read again> 

                   "Lowercase sigma followed by beta"

l.79 cmchar "Lowercase sigma followed by beta"

                                              ;

! Extra tokens will be flushed.

<to be read again> 

                   "Lowercase sigma followed by beta"

l.79 cmchar "Lowercase sigma followed by beta"

                                              ;

>> begindoublechar

! Isolated expression.

<to be read again> 

                   (

l.80 begindoublechar(

                     oct"002",dim_sigma);

! Extra tokens will be flushed.

<to be read again> 

                   (

l.80 begindoublechar(

                     oct"002",dim_sigma);

>> mid_sigma

! Isolated expression.

<to be read again> 

                   ;

l.81 mid_sigma;

                middoublechar(dims); this_letter; endchar;

>> middoublechar

! Isolated expression.

<to be read again> 

                   (

l.81 mid_sigma; middoublechar(

                              dims); this_letter; endchar;

! Extra tokens will be flushed.

<to be read again> 

                   (

l.81 mid_sigma; middoublechar(

                              dims); this_letter; endchar;

>> this_letter

! Isolated expression.

<to be read again> 

                   ;

l.81 mid_sigma; middoublechar(dims); this_letter;

                                                  endchar;

[98]

! Extra `endgroup'.

endchar->...makebox(screenrule);showit;fi.endgroup

l.81 ... middoublechar(dims); this_letter; endchar

                                                  ;

)

! Emergency stop.

<*> \mode:=cx;nonstopmode;input B

Output written on B.2602gf (2 characters, 392 bytes).

Transcript written on B.log.

miktex-maketfm.exe: Windows API error 2: Le fichier spécifié est introuvable.

miktex-maketfm.exe: Data: B.tfm
Running miktex-makemf.exe...
miktex-makemf: The Erewhon source file could not be found.

Running hbf2gf.exe...

hbf2gf (CJK ver. 4.8.3)

Couldn't find `Erewh.cfg'

miktex-maketfm: No creation rule for font Erewhon.
Making I.tfm from "C:\Programmes\MiKTeX 2.9\fonts\source\public\levy-font\I.mf"...
Running miktex-mf.exe...
This is METAFONT, Version 2.718281 (MiKTeX 2.9 64-bit)

(C:\Programmes\MiKTeX 2.9\fonts\source\public\levy-font\I.mf

>> readfrom

! Isolated expression.

<to be read again> 

                   (

l.26 if unknown gen_acc : readfrom(

                                   "gen_acc") fi

! Extra tokens will be flushed.

<to be read again> 

                   (

l.26 if unknown gen_acc : readfrom(

                                   "gen_acc") fi

>> cmchar

! Isolated expression.

<to be read again> 

                   "Lowercase iota"

l.61 cmchar "Lowercase iota"

                            ;

! Extra tokens will be flushed.

<to be read again> 

                   "Lowercase iota"

l.61 cmchar "Lowercase iota"

                            ;

>> width#

! Internal quantity `charwd' must receive a known value.

<to be read again> 

                   ;

beginchar->...byte(EXPR0)else:0fi;charwd:=(EXPR1);

                                                  charht:=(EXPR2);chardp:=(E...

l.62 beginchar("i",dims)

                        ;

>> x_height#

! Internal quantity `charht' must receive a known value.

<to be read again> 

                   ;

beginchar->...0fi;charwd:=(EXPR1);charht:=(EXPR2);

                                                  chardp:=(EXPR3);w:=hround(...

l.62 beginchar("i",dims)

                        ;

>> this_letter

! Isolated expression.

<to be read again> 

                   ;

l.63 this_letter;

                  penlabels(1,2,3,4); endchar;

[105]

>> cmchar

! Isolated expression.

<to be read again> 

                   "Lowercase iota with grave"

l.67 cmchar "Lowercase iota with grave"

                                       ;

! Extra tokens will be flushed.

<to be read again> 

                   "Lowercase iota with grave"

l.67 cmchar "Lowercase iota with grave"

                                       ;

>> width#

! Internal quantity `charwd' must receive a known value.

<to be read again> 

                   ;

beginchar->...byte(EXPR0)else:0fi;charwd:=(EXPR1);

                                                  charht:=(EXPR2);chardp:=(E...

l.68 beginchar(oct"310",width#,acc_ht#,0)

                                         ;

>> acc_ht#

! Internal quantity `charht' must receive a known value.

<to be read again> 

                   ;

beginchar->...0fi;charwd:=(EXPR1);charht:=(EXPR2);

                                                  chardp:=(EXPR3);w:=hround(...

l.68 beginchar(oct"310",width#,acc_ht#,0)

                                         ;

>> this_letter

! Isolated expression.

<to be read again> 

                   ;

l.69 this_letter;

                  grave(x_baryctr); endchar;

>> grave

! Isolated expression.

<to be read again> 

                   (

l.69 this_letter; grave(

                        x_baryctr); endchar;

! Extra tokens will be flushed.

<to be read again> 

                   (

l.69 this_letter; grave(

                        x_baryctr); endchar;

[200]

>> cmchar

! Isolated expression.

<to be read again> 

                   "Lowercase iota with rough breathing"

l.71 cmchar "Lowercase iota with rough breathing"

                                                 ;

! Extra tokens will be flushed.

<to be read again> 

                   "Lowercase iota with rough breathing"

l.71 cmchar "Lowercase iota with rough breathing"

                                                 ;

>> width#

! Internal quantity `charwd' must receive a known value.

<to be read again> 

                   ;

beginchar->...byte(EXPR0)else:0fi;charwd:=(EXPR1);

                                                  charht:=(EXPR2);chardp:=(E...

l.72 beginchar(oct"311",width#,acc_ht#,0)

                                         ;

>> acc_ht#

! Internal quantity `charht' must receive a known value.

<to be read again> 

                   ;

beginchar->...0fi;charwd:=(EXPR1);charht:=(EXPR2);

                                                  chardp:=(EXPR3);w:=hround(...

l.72 beginchar(oct"311",width#,acc_ht#,0)

                                         ;

>> this_letter

! Isolated expression.

<to be read again> 

                   ;

l.73 this_letter;

                  spirit(x_baryctr if serifs: +.25u fi)<; endchar;

>> spirit

! Isolated expression.

<to be read again> 

                   (

l.73 this_letter; spirit(

                         x_baryctr if serifs: +.25u fi)<; endchar;

! Extra tokens will be flushed.

<to be read again> 

                   (

l.73 this_letter; spirit(

                         x_baryctr if serifs: +.25u fi)<; endchar;

[201]

>> cmchar

! Isolated expression.

<to be read again> 

                   "Lowercase iota with smooth breathing"

l.75 cmchar "Lowercase iota with smooth breathing"

                                                  ;

! Extra tokens will be flushed.

<to be read again> 

                   "Lowercase iota with smooth breathing"

l.75 cmchar "Lowercase iota with smooth breathing"

                                                  ;

>> width#

! Internal quantity `charwd' must receive a known value.

<to be read again> 

                   ;

beginchar->...byte(EXPR0)else:0fi;charwd:=(EXPR1);

                                                  charht:=(EXPR2);chardp:=(E...

l.76 beginchar(oct"312",width#,acc_ht#,0)

                                         ;

>> acc_ht#

! Internal quantity `charht' must receive a known value.

<to be read again> 

                   ;

beginchar->...0fi;charwd:=(EXPR1);charht:=(EXPR2);

                                                  chardp:=(EXPR3);w:=hround(...

l.76 beginchar(oct"312",width#,acc_ht#,0)

                                         ;

>> this_letter

! Isolated expression.

<to be read again> 

                   ;

l.77 this_letter;

                  spirit(x_baryctr if serifs: -.25u fi)>; endchar;

>> spirit

! Isolated expression.

<to be read again> 

                   (

l.77 this_letter; spirit(

                         x_baryctr if serifs: -.25u fi)>; endchar;

! Extra tokens will be flushed.

<to be read again> 

                   (

l.77 this_letter; spirit(

                         x_baryctr if serifs: -.25u fi)>; endchar;

[202]

>> cmchar

! Isolated expression.

<to be read again> 

                   "Lowercase sigma followed by iota with grave"

l.79 ...wercase sigma followed by iota with grave"

                                                  ;

! Extra tokens will be flushed.

<to be read again> 

                   "Lowercase sigma followed by iota with grave"

l.79 ...wercase sigma followed by iota with grave"

                                                  ;

>> begindoublechar

! Isolated expression.

<to be read again> 

                   (

l.80 begindoublechar(

                     oct"313",dim_sigma);

! Extra tokens will be flushed.

<to be read again> 

                   (

l.80 begindoublechar(

                     oct"313",dim_sigma);

>> mid_sigma

! Isolated expression.

<to be read again> 

                   ;

l.81 mid_sigma;

                middoublechar(width#,acc_ht#,0);

>> middoublechar

! Isolated expression.

<to be read again> 

                   (

l.81 mid_sigma; middoublechar(

                              width#,acc_ht#,0);

! Extra tokens will be flushed.

<to be read again> 

                   (

l.81 mid_sigma; middoublechar(

                              width#,acc_ht#,0);

>> this_letter

! Isolated expression.

<to be read again> 

                   ;

l.82 this_letter;

                  grave(x_baryctr); endchar;

>> grave

! Isolated expression.

<to be read again> 

                   (

l.82 this_letter; grave(

                        x_baryctr); endchar;

! Extra tokens will be flushed.

<to be read again> 

                   (

l.82 this_letter; grave(

                        x_baryctr); endchar;

[202]

! Extra `endgroup'.

endchar->...makebox(screenrule);showit;fi.endgroup

l.82 this_letter; grave(x_baryctr); endchar

                                           ;

>> cmchar

! Isolated expression.

<to be read again> 

                   "Lowercase iota with acute"

l.84 cmchar "Lowercase iota with acute"

                                       ;

! Extra tokens will be flushed.

<to be read again> 

                   "Lowercase iota with acute"

l.84 cmchar "Lowercase iota with acute"

                                       ;

>> width#

! Internal quantity `charwd' must receive a known value.

<to be read again> 

                   ;

beginchar->...byte(EXPR0)else:0fi;charwd:=(EXPR1);

                                                  charht:=(EXPR2);chardp:=(E...

l.85 beginchar(oct"320",width#,acc_ht#,0)

                                         ;

>> acc_ht#

! Internal quantity `charht' must receive a known value.

<to be read again> 

                   ;

beginchar->...0fi;charwd:=(EXPR1);charht:=(EXPR2);

                                                  chardp:=(EXPR3);w:=hround(...

l.85 beginchar(oct"320",width#,acc_ht#,0)

                                         ;

>> this_letter

! Isolated expression.

<to be read again> 

                   ;

l.86 this_letter;

                  acute(x_baryctr); endchar;

>> acute

! Isolated expression.

<to be read again> 

                   (

l.86 this_letter; acute(

                        x_baryctr); endchar;

! Extra tokens will be flushed.

<to be read again> 

                   (

l.86 this_letter; acute(

                        x_baryctr); endchar;

[208]

>> cmchar

! Isolated expression.

<to be read again> 

                   "Lowercase iota with rough breathing and acute"

l.88 ...rcase iota with rough breathing and acute"

                                                  ;

! Extra tokens will be flushed.

<to be read again> 

                   "Lowercase iota with rough breathing and acute"

l.88 ...rcase iota with rough breathing and acute"

                                                  ;

>> width#

! Internal quantity `charwd' must receive a known value.

<to be read again> 

                   ;

beginchar->...byte(EXPR0)else:0fi;charwd:=(EXPR1);

                                                  charht:=(EXPR2);chardp:=(E...

l.89 beginchar(oct"321",width#,acc_ht#,0)

                                         ;

>> acc_ht#

! Internal quantity `charht' must receive a known value.

<to be read again> 

                   ;

beginchar->...0fi;charwd:=(EXPR1);charht:=(EXPR2);

                                                  chardp:=(EXPR3);w:=hround(...

l.89 beginchar(oct"321",width#,acc_ht#,0)

                                         ;

>> this_letter

! Isolated expression.

<to be read again> 

                   ;

l.90 this_letter;

                  spirit_acute(x_baryctr)<; endchar;

>> spirit_acute

! Isolated expression.

<to be read again> 

                   (

l.90 this_letter; spirit_acute(

                               x_baryctr)<; endchar;

! Extra tokens will be flushed.

<to be read again> 

                   (

l.90 this_letter; spirit_acute(

                               x_baryctr)<; endchar;

[209]

>> cmchar

! Isolated expression.

<to be read again> 

                   "Lowercase iota with smooth breathing and acute"

l.92 ...case iota with smooth breathing and acute"

                                                  ;

! Extra tokens will be flushed.

<to be read again> 

                   "Lowercase iota with smooth breathing and acute"

l.92 ...case iota with smooth breathing and acute"

                                                  ;

>> width#

! Internal quantity `charwd' must receive a known value.

<to be read again> 

                   ;

beginchar->...byte(EXPR0)else:0fi;charwd:=(EXPR1);

                                                  charht:=(EXPR2);chardp:=(E...

l.93 beginchar(oct"322",width#,acc_ht#,0)

                                         ;

>> acc_ht#

! Internal quantity `charht' must receive a known value.

<to be read again> 

                   ;

beginchar->...0fi;charwd:=(EXPR1);charht:=(EXPR2);

                                                  chardp:=(EXPR3);w:=hround(...

l.93 beginchar(oct"322",width#,acc_ht#,0)

                                         ;

>> this_letter

! Isolated expression.

<to be read again> 

                   ;

l.94 this_letter;

                  spirit_acute(x_baryctr)>; endchar;

>> spirit_acute

! Isolated expression.

<to be read again> 

                   (

l.94 this_letter; spirit_acute(

                               x_baryctr)>; endchar;

! Extra tokens will be flushed.

<to be read again> 

                   (

l.94 this_letter; spirit_acute(

                               x_baryctr)>; endchar;

[210]

>> cmchar

! Isolated expression.

<to be read again> 

                   "Lowercase sigma followed by iota with acute"

l.96 ...wercase sigma followed by iota with acute"

                                                  ;

! Extra tokens will be flushed.

<to be read again> 

                   "Lowercase sigma followed by iota with acute"

l.96 ...wercase sigma followed by iota with acute"

                                                  ;

>> begindoublechar

! Isolated expression.

<to be read again> 

                   (

l.97 begindoublechar(

                     oct"323",dim_sigma);

! Extra tokens will be flushed.

<to be read again> 

                   (

l.97 begindoublechar(

                     oct"323",dim_sigma);

>> mid_sigma

! Isolated expression.

<to be read again> 

                   ;

l.98 mid_sigma;

                middoublechar(width#,acc_ht#,0);

>> middoublechar

! Isolated expression.

<to be read again> 

                   (

l.98 mid_sigma; middoublechar(

                              width#,acc_ht#,0);

! Extra tokens will be flushed.

<to be read again> 

                   (

l.98 mid_sigma; middoublechar(

                              width#,acc_ht#,0);

>> this_letter

! Isolated expression.

<to be read again> 

                   ;

l.99 this_letter;

                  acute(x_baryctr); endchar;

>> acute

! Isolated expression.

<to be read again> 

                   (

l.99 this_letter; acute(

                        x_baryctr); endchar;

! Extra tokens will be flushed.

<to be read again> 

                   (

l.99 this_letter; acute(

                        x_baryctr); endchar;

[210]

! Extra `endgroup'.

endchar->...makebox(screenrule);showit;fi.endgroup

l.99 this_letter; acute(x_baryctr); endchar

                                           ;

>> cmchar

! Isolated expression.

<to be read again> 

                   "Lowercase iota with circumflex"

l.101 cmchar "Lowercase iota with circumflex"

                                             ;

! Extra tokens will be flushed.

<to be read again> 

                   "Lowercase iota with circumflex"

l.101 cmchar "Lowercase iota with circumflex"

                                             ;

>> width#

! Internal quantity `charwd' must receive a known value.

<to be read again> 

                   ;

beginchar->...byte(EXPR0)else:0fi;charwd:=(EXPR1);

                                                  charht:=(EXPR2);chardp:=(E...

l.102 beginchar(oct"330",width#,circ_ht#,0)

                                           ;

>> circ_ht#

! Internal quantity `charht' must receive a known value.

<to be read again> 

                   ;

beginchar->...0fi;charwd:=(EXPR1);charht:=(EXPR2);

                                                  chardp:=(EXPR3);w:=hround(...

l.102 beginchar(oct"330",width#,circ_ht#,0)

                                           ;

>> this_letter

! Isolated expression.

<to be read again> 

                   ;

l.103 this_letter;

                   circumflex(x_baryctr); endchar;

>> circumflex

! Isolated expression.

<to be read again> 

                   (

l.103 this_letter; circumflex(

                              x_baryctr); endchar;

! Extra tokens will be flushed.

<to be read again> 

                   (

l.103 this_letter; circumflex(

                              x_baryctr); endchar;

[216]

>> cmchar

! Isolated expression.

<to be read again> 

                   "Lowercase iota with rough breathing and circumflex"

l.105 ...iota with rough breathing and circumflex"

                                                  ;

! Extra tokens will be flushed.

<to be read again> 

                   "Lowercase iota with rough breathing and circumflex"

l.105 ...iota with rough breathing and circumflex"

                                                  ;

>> width#

! Internal quantity `charwd' must receive a known value.

<to be read again> 

                   ;

beginchar->...byte(EXPR0)else:0fi;charwd:=(EXPR1);

                                                  charht:=(EXPR2);chardp:=(E...

l.106 beginchar(oct"331",width#,Circ_ht#,0)

                                           ;

>> Circ_ht#

! Internal quantity `charht' must receive a known value.

<to be read again> 

                   ;

beginchar->...0fi;charwd:=(EXPR1);charht:=(EXPR2);

                                                  chardp:=(EXPR3);w:=hround(...

l.106 beginchar(oct"331",width#,Circ_ht#,0)

                                           ;

>> this_letter

! Isolated expression.

<to be read again> 

                   ;

l.107 this_letter;

                   spirit_circumflex(x_baryctr)<; endchar;

>> spirit_circumflex

! Isolated expression.

<to be read again> 

                   (

l.107 this_letter; spirit_circumflex(

                                     x_baryctr)<; endchar;

! Extra tokens will be flushed.

<to be read again> 

                   (

l.107 this_letter; spirit_circumflex(

                                     x_baryctr)<; endchar;

[217]

>> cmchar

! Isolated expression.

<to be read again> 

                   "Lowercase iota with smooth breathing and circumflex"

l.109 ...ota with smooth breathing and circumflex"

                                                  ;

! Extra tokens will be flushed.

<to be read again> 

                   "Lowercase iota with smooth breathing and circumflex"

l.109 ...ota with smooth breathing and circumflex"

                                                  ;

>> width#

! Internal quantity `charwd' must receive a known value.

<to be read again> 

                   ;

beginchar->...byte(EXPR0)else:0fi;charwd:=(EXPR1);

                                                  charht:=(EXPR2);chardp:=(E...

l.110 beginchar(oct"332",width#,Circ_ht#,0)

                                           ;

>> Circ_ht#

! Internal quantity `charht' must receive a known value.

<to be read again> 

                   ;

beginchar->...0fi;charwd:=(EXPR1);charht:=(EXPR2);

                                                  chardp:=(EXPR3);w:=hround(...

l.110 beginchar(oct"332",width#,Circ_ht#,0)

                                           ;

>> this_letter

! Isolated expression.

<to be read again> 

                   ;

l.111 this_letter;

                   spirit_circumflex(x_baryctr)>; endchar;

>> spirit_circumflex

! Isolated expression.

<to be read again> 

                   (

l.111 this_letter; spirit_circumflex(

                                     x_baryctr)>; endchar;

! Extra tokens will be flushed.

<to be read again> 

                   (

l.111 this_letter; spirit_circumflex(

                                     x_baryctr)>; endchar;

[218]

>> cmchar

! Isolated expression.

<to be read again> 

                   "Lowercase sigma followed by iota with circumflex"

l.113 ...e sigma followed by iota with circumflex"

                                                  ;

! Extra tokens will be flushed.

<to be read again> 

                   "Lowercase sigma followed by iota with circumflex"

l.113 ...e sigma followed by iota with circumflex"

                                                  ;

>> begindoublechar

! Isolated expression.

<to be read again> 

                   (

l.114 begindoublechar(

                      oct"333",dim_sigma);

! Extra tokens will be flushed.

<to be read again> 

                   (

l.114 begindoublechar(

                      oct"333",dim_sigma);

>> mid_sigma

! Isolated expression.

<to be read again> 

                   ;

l.115 mid_sigma;

                 middoublechar(width#,acc_ht#,0);

>> middoublechar

! Isolated expression.

<to be read again> 

                   (

l.115 mid_sigma; middoublechar(

                               width#,acc_ht#,0);

! Extra tokens will be flushed.

<to be read again> 

                   (

l.115 mid_sigma; middoublechar(

                               width#,acc_ht#,0);

>> this_letter

! Isolated expression.

<to be read again> 

                   ;

l.116 this_letter;

                   circumflex(x_baryctr); endchar;

>> circumflex

! Isolated expression.

<to be read again> 

                   (

l.116 this_letter; circumflex(

                              x_baryctr); endchar;

! Extra tokens will be flushed.

<to be read again> 

                   (

l.116 this_letter; circumflex(

                              x_baryctr); endchar;

[218]

! Extra `endgroup'.

endchar->...makebox(screenrule);showit;fi.endgroup

l.116 this_letter; circumflex(x_baryctr); endchar

                                                 ;

>> cmchar

! Isolated expression.

<to be read again> 

                   "Lowercase iota with diaeresis"

l.118 cmchar "Lowercase iota with diaeresis"

                                            ;

! Extra tokens will be flushed.

<to be read again> 

                   "Lowercase iota with diaeresis"

l.118 cmchar "Lowercase iota with diaeresis"

                                            ;

>> width#

! Internal quantity `charwd' must receive a known value.

<to be read again> 

                   ;

beginchar->...byte(EXPR0)else:0fi;charwd:=(EXPR1);

                                                  charht:=(EXPR2);chardp:=(E...

l.119 beginchar(oct"360",width#,circ_ht#,0)

                                           ;

>> circ_ht#

! Internal quantity `charht' must receive a known value.

<to be read again> 

                   ;

beginchar->...0fi;charwd:=(EXPR1);charht:=(EXPR2);

                                                  chardp:=(EXPR3);w:=hround(...

l.119 beginchar(oct"360",width#,circ_ht#,0)

                                           ;

>> this_letter

! Isolated expression.

<to be read again> 

                   ;

l.120 this_letter;

                   diaeresis(x_baryctr); endchar;

>> diaeresis

! Isolated expression.

<to be read again> 

                   (

l.120 this_letter; diaeresis(

                             x_baryctr); endchar;

! Extra tokens will be flushed.

<to be read again> 

                   (

l.120 this_letter; diaeresis(

                             x_baryctr); endchar;

[240]

>> cmchar

! Isolated expression.

<to be read again> 

                   "Lowercase iota with diaeresis and grave"

l.122 ..."Lowercase iota with diaeresis and grave"

                                                  ;

! Extra tokens will be flushed.

<to be read again> 

                   "Lowercase iota with diaeresis and grave"

l.122 ..."Lowercase iota with diaeresis and grave"

                                                  ;

>> width#

! Internal quantity `charwd' must receive a known value.

<to be read again> 

                   ;

beginchar->...byte(EXPR0)else:0fi;charwd:=(EXPR1);

                                                  charht:=(EXPR2);chardp:=(E...

l.123 beginchar(oct"361",width#,acc_ht#,0)

                                          ;

>> acc_ht#

! Internal quantity `charht' must receive a known value.

<to be read again> 

                   ;

beginchar->...0fi;charwd:=(EXPR1);charht:=(EXPR2);

                                                  chardp:=(EXPR3);w:=hround(...

l.123 beginchar(oct"361",width#,acc_ht#,0)

                                          ;

>> this_letter

! Isolated expression.

<to be read again> 

                   ;

l.124 this_letter;

                   diaeresis_grave(x_baryctr); endchar;

>> diaeresis_grave

! Isolated expression.

<to be read again> 

                   (

l.124 this_letter; diaeresis_grave(

                                   x_baryctr); endchar;

! Extra tokens will be flushed.

<to be read again> 

                   (

l.124 this_letter; diaeresis_grave(

                                   x_baryctr); endchar;

[241]

>> cmchar

! Isolated expression.

<to be read again> 

                   "Lowercase iota with diaeresis and acute"

l.126 ..."Lowercase iota with diaeresis and acute"

                                                  ;

! Extra tokens will be flushed.

<to be read again> 

                   "Lowercase iota with diaeresis and acute"

l.126 ..."Lowercase iota with diaeresis and acute"

                                                  ;

>> width#

! Internal quantity `charwd' must receive a known value.

<to be read again> 

                   ;

beginchar->...byte(EXPR0)else:0fi;charwd:=(EXPR1);

                                                  charht:=(EXPR2);chardp:=(E...

l.127 beginchar(oct"362",width#,acc_ht#,0)

                                          ;

>> acc_ht#

! Internal quantity `charht' must receive a known value.

<to be read again> 

                   ;

beginchar->...0fi;charwd:=(EXPR1);charht:=(EXPR2);

                                                  chardp:=(EXPR3);w:=hround(...

l.127 beginchar(oct"362",width#,acc_ht#,0)

                                          ;

>> this_letter

! Isolated expression.

<to be read again> 

                   ;

l.128 this_letter;

                   diaeresis_acute(x_baryctr); endchar;

>> diaeresis_acute

! Isolated expression.

<to be read again> 

                   (

l.128 this_letter; diaeresis_acute(

                                   x_baryctr); endchar;

! Extra tokens will be flushed.

<to be read again> 

                   (

l.128 this_letter; diaeresis_acute(

                                   x_baryctr); endchar;

[242]

>> cmchar

! Isolated expression.

<to be read again> 

                   "Lowercase iota with diaeresis and circumflex"

l.130 ...rcase iota with diaeresis and circumflex"

                                                  ;

! Extra tokens will be flushed.

<to be read again> 

                   "Lowercase iota with diaeresis and circumflex"

l.130 ...rcase iota with diaeresis and circumflex"

                                                  ;

>> width#

! Internal quantity `charwd' must receive a known value.

<to be read again> 

                   ;

beginchar->...byte(EXPR0)else:0fi;charwd:=(EXPR1);

                                                  charht:=(EXPR2);chardp:=(E...

l.131 beginchar(oct"363",width#,Circ_ht#,0)

                                           ;

>> Circ_ht#

! Internal quantity `charht' must receive a known value.

<to be read again> 

                   ;

beginchar->...0fi;charwd:=(EXPR1);charht:=(EXPR2);

                                                  chardp:=(EXPR3);w:=hround(...

l.131 beginchar(oct"363",width#,Circ_ht#,0)

                                           ;

>> this_letter

! Isolated expression.

<to be read again> 

                   ;

l.132 this_letter;

                   diaeresis_circumflex(x_baryctr); endchar;

>> diaeresis_circumflex

! Isolated expression.

<to be read again> 

                   (

l.132 this_letter; diaeresis_circumflex(

                                        x_baryctr); endchar;

! Extra tokens will be flushed.

<to be read again> 

                   (

l.132 this_letter; diaeresis_circumflex(

                                        x_baryctr); endchar;

[243]

>> cmchar

! Isolated expression.

<to be read again> 

                   "Lowercase sigma followed by iota"

l.134 cmchar "Lowercase sigma followed by iota"

                                               ;

! Extra tokens will be flushed.

<to be read again> 

                   "Lowercase sigma followed by iota"

l.134 cmchar "Lowercase sigma followed by iota"

                                               ;

>> begindoublechar

! Isolated expression.

<to be read again> 

                   (

l.135 begindoublechar(

                      oct"011",dim_sigma);

! Extra tokens will be flushed.

<to be read again> 

                   (

l.135 begindoublechar(

                      oct"011",dim_sigma);

>> mid_sigma

! Isolated expression.

<to be read again> 

                   ;

l.136 mid_sigma;

                 middoublechar(dims); this_letter; endchar;

>> middoublechar

! Isolated expression.

<to be read again> 

                   (

l.136 mid_sigma; middoublechar(

                               dims); this_letter; endchar;

! Extra tokens will be flushed.

<to be read again> 

                   (

l.136 mid_sigma; middoublechar(

                               dims); this_letter; endchar;

>> this_letter

! Isolated expression.

<to be read again> 

                   ;

l.136 mid_sigma; middoublechar(dims); this_letter;

                                                   endchar;

[243]

! Extra `endgroup'.

endchar->...makebox(screenrule);showit;fi.endgroup

l.136 ...middoublechar(dims); this_letter; endchar

                                                  ;

)

! Emergency stop.

<*> \mode:=cx;nonstopmode;input I

Output written on I.2602gf (18 characters, 2796 bytes).

Transcript written on I.log.

miktex-maketfm.exe: Windows API error 2: Le fichier spécifié est introuvable.

miktex-maketfm.exe: Data: I.tfm
Running miktex-makemf.exe...
miktex-makemf: The Erewhon source file could not be found.

Running hbf2gf.exe...

hbf2gf (CJK ver. 4.8.3)

Couldn't find `Erewh.cfg'

miktex-maketfm: No creation rule for font Erewhon.
Running miktex-makemf.exe...
miktex-makemf: The BI source file could not be found.

Running hbf2gf.exe...

hbf2gf (CJK ver. 4.8.3)

`BI' can't be a subfont created by hbf2gf

miktex-maketfm: No creation rule for font BI.
Running miktex-makemf.exe...
miktex-makemf: The Erewhon: source file could not be found.

Running hbf2gf.exe...

hbf2gf (CJK ver. 4.8.3)

Couldn't find `Erewho.cfg'

miktex-maketfm: No creation rule for font Erewhon:.

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
! fontspec error: "font-not-found"
! 
! The font "Erewhon" cannot be found.
! 
! See the fontspec documentation for further information.
! 
! For immediate help type H <return>.
!...............................................  

l.3 \setmainfont{Erewhon}
                          % Free Utopia like font

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
! fontspec error: "font-not-found"
! 
! The font "Erewhon" cannot be found.
! 
! See the fontspec documentation for further information.
! 
! For immediate help type H <return>.
!...............................................  

l.3 \setmainfont{Erewhon}
                          % Free Utopia like font
! Font EU1/Erewhon(0)/m/n/10=Erewhon: at 10.0pt not loadable: Metric (TFM) file
 or installed font not found.
<to be read again> 
                   relax 
l.3 \setmainfont{Erewhon}
                          % Free Utopia like font
("C:\Programmes\MiKTeX 2.9\tex\latex\realscripts\realscripts.sty"
*************************************************
* LaTeX warning: "xparse/redefine-command"
* 
* Redefining document command \textsubscript with arg. spec. 's' on line 25.
*************************************************
*************************************************
* LaTeX warning: "xparse/redefine-command"
* 
* Redefining document command \textsuperscript with arg. spec. 's' on line 28.
*************************************************
) ("C:\Programmes\MiKTeX 2.9\tex\generic\babel\babel.sty"
*************************************
* Local config file bblopts.cfg used
*
("C:\Programmes\MiKTeX 2.9\tex\latex\00miktex\bblopts.cfg")
("C:\Programmes\MiKTeX 2.9\tex\generic\babel\frenchb.ldf"
("C:\Programmes\MiKTeX 2.9\tex\generic\babel\babel.def")
*************************************
* Local config file frenchb.cfg used
*
("C:\Programmes\MiKTeX 2.9\tex\generic\babel\frenchb.cfg")))
("C:\Programmes\MiKTeX 2.9\tex\latex\carlisle\scalefnt.sty")
(C:\Nos_Programmes\msys\share\texmf\tex\latex\fmtcount\fmtcount.sty
("C:\Programmes\MiKTeX 2.9\tex\latex\base\ifthen.sty")
("C:\Programmes\MiKTeX 2.9\tex\latex\etoolbox\etoolbox.sty")
(C:\Nos_Programmes\msys\share\texmf\tex\latex\fmtcount\fcprefix.sty
(C:\Nos_Programmes\msys\share\texmf\tex\latex\fmtcount\fcnumparser.sty))
("C:\Programmes\MiKTeX 2.9\tex\generic\ifxetex\ifxetex.sty")
("C:\Programmes\MiKTeX 2.9\tex\latex\amsmath\amsgen.sty")
(C:\Nos_Programmes\msys\share\texmf\tex\latex\fmtcount\fc-french.def))
("C:\Programmes\MiKTeX 2.9\tex\latex\tools\array.sty")
(C:\Nos_Programmes\msys\share\texmf\tex\latex\preview\preview.sty
(C:\Nos_Programmes\msys\share\texmf\tex\latex\preview\prtightpage.def))
(c:\Nos_Programmes\msys\local\projects\fmtcount\ecm.aux)
("C:\Programmes\MiKTeX 2.9\tex\latex\tipa\t3cmr.fd")Running miktex-makemf.exe...
miktex-makemf: The Erewhon: source file could not be found.

Running hbf2gf.exe...

hbf2gf (CJK ver. 4.8.3)

Couldn't find `Erewho.cfg'

miktex-maketfm: No creation rule for font Erewhon:.
Running miktex-makemf.exe...
miktex-makemf: The Erewhon: source file could not be found.

Running hbf2gf.exe...

hbf2gf (CJK ver. 4.8.3)

Couldn't find `Erewho.cfg'

miktex-maketfm: No creation rule for font Erewhon:.
Running miktex-makemf.exe...
miktex-makemf: The Erewhon: source file could not be found.

Running hbf2gf.exe...

hbf2gf (CJK ver. 4.8.3)

Couldn't find `Erewho.cfg'

miktex-maketfm: No creation rule for font Erewhon:.
Running miktex-makemf.exe...
miktex-makemf: The Erewhon: source file could not be found.

Running hbf2gf.exe...

hbf2gf (CJK ver. 4.8.3)

Couldn't find `Erewho.cfg'

miktex-maketfm: No creation rule for font Erewhon:.
Running miktex-makemf.exe...
miktex-makemf: The Erewhon: source file could not be found.

Running hbf2gf.exe...

hbf2gf (CJK ver. 4.8.3)

Couldn't find `Erewho.cfg'

miktex-maketfm: No creation rule for font Erewhon:.
Running miktex-makemf.exe...
miktex-makemf: The Erewhon: source file could not be found.

Running hbf2gf.exe...

hbf2gf (CJK ver. 4.8.3)

Couldn't find `Erewho.cfg'

miktex-maketfm: No creation rule for font Erewhon:.
Running miktex-makemf.exe...
miktex-makemf: The Erewhon: source file could not be found.

Running hbf2gf.exe...

hbf2gf (CJK ver. 4.8.3)

Couldn't find `Erewho.cfg'

miktex-maketfm: No creation rule for font Erewhon:.
Running miktex-makemf.exe...
miktex-makemf: The Erewhon: source file could not be found.

Running hbf2gf.exe...

hbf2gf (CJK ver. 4.8.3)

Couldn't find `Erewho.cfg'

miktex-maketfm: No creation rule for font Erewhon:.
Running miktex-makemf.exe...
miktex-makemf: The Erewhon: source file could not be found.

Running hbf2gf.exe...

hbf2gf (CJK ver. 4.8.3)

Couldn't find `Erewho.cfg'

miktex-maketfm: No creation rule for font Erewhon:.
Running miktex-makemf.exe...
miktex-makemf: The Erewhon: source file could not be found.

Running hbf2gf.exe...

hbf2gf (CJK ver. 4.8.3)

Couldn't find `Erewho.cfg'

miktex-maketfm: No creation rule for font Erewhon:.
Running miktex-makemf.exe...
miktex-makemf: The Erewhon: source file could not be found.

Running hbf2gf.exe...

hbf2gf (CJK ver. 4.8.3)

Couldn't find `Erewho.cfg'

miktex-maketfm: No creation rule for font Erewhon:.
Running miktex-makemf.exe...
miktex-makemf: The Erewhon: source file could not be found.

Running hbf2gf.exe...

hbf2gf (CJK ver. 4.8.3)

Couldn't find `Erewho.cfg'

miktex-maketfm: No creation rule for font Erewhon:.
Running miktex-makemf.exe...
miktex-makemf: The Erewhon: source file could not be found.

Running hbf2gf.exe...

hbf2gf (CJK ver. 4.8.3)

Couldn't find `Erewho.cfg'

miktex-maketfm: No creation rule for font Erewhon:.
Running miktex-makemf.exe...
miktex-makemf: The Erewhon: source file could not be found.

Running hbf2gf.exe...

hbf2gf (CJK ver. 4.8.3)

Couldn't find `Erewho.cfg'

miktex-maketfm: No creation rule for font Erewhon:.
Running miktex-makemf.exe...
miktex-makemf: The Erewhon: source file could not be found.

Running hbf2gf.exe...

hbf2gf (CJK ver. 4.8.3)

Couldn't find `Erewho.cfg'

miktex-maketfm: No creation rule for font Erewhon:.

Preview: Fontsize 10pt
Preview: PDFoutput 1
! Font EU1/Erewhon(0)/m/n/7=Erewhon: at 7.0pt not loadable: Metric (TFM) file o
r installed font not found.
<to be read again> 
                   relax 
l.11 \begin{tabular}
                    {@{ }l@{ }l@{ }l@{ }}
! Font EU1/Erewhon(0)/m/n/5=Erewhon: at 5.0pt not loadable: Metric (TFM) file o
r installed font not found.
<to be read again> 
                   relax 
l.11 \begin{tabular}
                    {@{ }l@{ }l@{ }l@{ }}
! Font \l_fontspec_font=Erewhon: at 10.0pt not loadable: Metric (TFM) file or i
nstalled font not found.
<to be read again> 
                   \scan_stop: 
l.13 1\ier
          &\ordinalnum{1}&1\textsuperscript{er}\\
! Font \l_fontspec_font=Erewhon: at 10.0pt not loadable: Metric (TFM) file or i
nstalled font not found.
<to be read again> 
                   \scan_stop: 
l.13 1\ier
          &\ordinalnum{1}&1\textsuperscript{er}\\
! Font EU1/Erewhon(0)/m/n/6.49994=Erewhon: at 6.49994pt not loadable: Metric (T
FM) file or installed font not found.
<to be read again> 
                   relax 
l.13 1\ier
          &\ordinalnum{1}&1\textsuperscript{er}\\
! Font \l_fontspec_font=Erewhon: at 10.0pt not loadable: Metric (TFM) file or i
nstalled font not found.
<to be read again> 
                   \scan_stop: 
l.13 1\ier&\ordinalnum{1}&
                          1\textsuperscript{er}\\
! Font \l_fontspec_font=Erewhon: at 10.0pt not loadable: Metric (TFM) file or i
nstalled font not found.
<to be read again> 
                   \scan_stop: 
l.13 1\ier&\ordinalnum{1}&
                          1\textsuperscript{er}\\
! Font \l_fontspec_font=Erewhon: at 10.0pt not loadable: Metric (TFM) file or i
nstalled font not found.
<to be read again> 
                   \scan_stop: 
l.13 1\ier&\ordinalnum{1}&1\textsuperscript{er}
                                               \\
! Font \l_fontspec_font=Erewhon: at 10.0pt not loadable: Metric (TFM) file or i
nstalled font not found.
<to be read again> 
                   \scan_stop: 
l.13 1\ier&\ordinalnum{1}&1\textsuperscript{er}
                                               \\
! Font \l_fontspec_font=Erewhon: at 10.0pt not loadable: Metric (TFM) file or i
nstalled font not found.
<to be read again> 
                   \scan_stop: 
l.14 2\ieme
           &\ordinalnum{2}&2\textsuperscript{e}\\
! Font \l_fontspec_font=Erewhon: at 10.0pt not loadable: Metric (TFM) file or i
nstalled font not found.
<to be read again> 
                   \scan_stop: 
l.14 2\ieme
           &\ordinalnum{2}&2\textsuperscript{e}\\
! Font \l_fontspec_font=Erewhon: at 10.0pt not loadable: Metric (TFM) file or i
nstalled font not found.
<to be read again> 
                   \scan_stop: 
l.14 2\ieme&\ordinalnum{2}&
                           2\textsuperscript{e}\\
! Font \l_fontspec_font=Erewhon: at 10.0pt not loadable: Metric (TFM) file or i
nstalled font not found.
<to be read again> 
                   \scan_stop: 
l.14 2\ieme&\ordinalnum{2}&
                           2\textsuperscript{e}\\
! Font \l_fontspec_font=Erewhon: at 10.0pt not loadable: Metric (TFM) file or i
nstalled font not found.
<to be read again> 
                   \scan_stop: 
l.14 2\ieme&\ordinalnum{2}&2\textsuperscript{e}
                                               \\
! Font \l_fontspec_font=Erewhon: at 10.0pt not loadable: Metric (TFM) file or i
nstalled font not found.
<to be read again> 
                   \scan_stop: 
l.14 2\ieme&\ordinalnum{2}&2\textsuperscript{e}
                                               \\
Preview: Tightpage -32891 -32891 32891 32891
[1] (c:\Nos_Programmes\msys\local\projects\fmtcount\ecm.aux)
** WARNING ** Couldn't open font map file "kanjix.map".
 )
(see the transcript file for additional information)
Output written on ecm.pdf (1 page).
Transcript written on ecm.log.

TeX Output exited abnormally with code 1 at Fri Nov 28 08:31:32
dflipo commented 9 years ago

Hello Vincent,

I have tried to compile your example (recalled below) with Erewhon:

[...]

I have followed the Erewhon instruction from Erewhon README file http://distrib-coffee.ipsl.jussieu.fr/pub/mirrors/ctan/fonts/erewhon/README for MikTeX 2.9. However there seems to be something missing (all the TFM files are there, but xelatex seems to fail to find them...) — MikTeX makes this output:

|("C:\Programmes\MiKTeX 2.9\tex\latex\fontspec\fontspec.cfg")))Running miktex-makemf.exe... miktex-makemf: The Erewhon source file could not be found.

You have a MiKTeX configuration problem, sorry I am not a MikTeX user, I can't help. Please ask for help on fctt for instance.

XeTeX doesn't need .tfm, .vf, .pfb, etc files, just the .otf files but these must be declared somehow…

Daniel Flipo

vincentb1 commented 9 years ago

Hello,

Sorry for the distrubance, it happens that I did a mistake when I unzipped the .tds.zip file and not all the files were copied to my TEXMF — I am not yet used to the improvements in MSWindows7 system unzipper :confused:. Michael Sharpe helped me realize this, here is his answer which I make public as it can be useful for other people:

The instructions I gave were mostly for setting up Erewhon for use in LaTeX, which is much more complex that for XeLaTeX. It's impossible to diagnose your problem without any information, but it should work as long as the Erewhon*.otf files and erewhon.fontspec are in positions where XeLaTeX can find them. Start by placing those five files in the same folder as your .tex document, then try moving them into your tex tree. As I no longer own a windows machine, it's hard to be more specific.

In a nutshell, compated to your message, please note that xelatex does not need only the .otf files, it also needs the .fontspec — and this was the one missing in my TEXMF.

So, anyway, I did the trial, and here is now how it looks: ecm

All the superscripts are the same. So, what I propose is the following:

Please Denis (@dbitouze), you are the one who raised this: are you happy with my proposal?

    Vincent.

dbitouze commented 9 years ago

@vincentb1 Yes! :) Except that \ordinalnum{2} still gives "2eme" on my machine, but I guess that's because I haven't the development version of fmtcount.

vincentb1 commented 9 years ago

To Denis (@dbitouze) To update, please with the developement try the following (not tested):

git clone https://github.com/nlct/fmtcount.git
cd fmtcount/dist
make install TEXMF_INSTALL_DIR=/where/you/want/to/install/it/texmf

with changing /where/you/want/to/install/it/texmf by the correct path.

dbitouze commented 9 years ago

It fails with (sorry: the following code block is not properly typeset, I don't know why):

/bin/bash: makedtx : unknown command
nlct commented 9 years ago

On 01/12/14 09:06, Denis Bitouzé wrote:

It fails with:

/bin/bash: makedtx : unknown command

It's on CTAN: http://www.ctan.org/pkg/makedtx

dbitouze commented 9 years ago

@nlct Ooops, sorry: I imagined it was a Vincent's home made script. makedtx was already installed but I didn't know I had to perform some post-installations steps. Anyway, following its documentation:

$ echo $PATH
.:/home/bitouze/bin:/usr/local/bin/:/usr/sbin/:/usr/bin:/bin:/usr/local/bin:/usr/X11R6/bin/:/usr/games:/usr/lib/qt4/bin:/usr/lib/qt5/bin:/usr/lib/qt5/bin
$ lll /home/bitouze/bin/makedtx.pl 
-rwxr-xr-x 1 bitouze bitouze 24K déc.   1 16:11 /home/bitouze/bin/makedtx.pl*
$ which perl
/usr/bin/perl
$ which makedtx.pl
/home/bitouze/bin/makedtx.pl
$ which makedtx
which: no makedtx in (.:/home/bitouze/bin:/usr/local/bin/:/usr/sbin/:/usr/bin:/bin:/usr/local/bin:/usr/X11R6/bin/:/usr/games:/usr/lib/qt4/bin:/usr/lib/qt5/bin:/usr/lib/qt5/bin)

I could manage with:

$ ln -s /home/bitouze/bin/makedtx.pl /home/bitouze/bin/makedtx

Just a little trouble:

$ make install TEXMF_INSTALL_DIR=...

failed because of:

! Package doc Error: Checksum not passed (9848<>9850).
dbitouze commented 9 years ago

@vincentb1 Well, I am a bit lost. The following MWE:

  1. shows the abbreviations are still not the same for 1\ier and \ordinalnum{1}.
  2. compiled with:
    • xetex (and using a font that has superscripts built-in), displays in the same way the abbreviations for both babel, fmtcount and textsuperscript,
    • pdflatex (and using a font that does not have superscripts built-in), displays differently the abbreviations for babel in one hand, and for fmtcount and textsuperscript in the other hand.
\documentclass[french]{minimal}
\usepackage{ifxetex}
\ifxetex
\usepackage{fontspec}
\usepackage{realscripts}
\setmainfont{Erewhon} % Free Utopia like font
\else
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\fi
\usepackage{fmtcount}
\usepackage[active,tightpage]{preview}
\usepackage{babel}
\begin{document}
\begin{preview}
   \begin{tabular}{@{ }l@{ }l@{ }l@{ }}
     babel  & fmtcount       & textsup.              \\\hline
     1\ier  & \ordinalnum{1} & 1\textsuperscript{er} \\
     2\ieme & \ordinalnum{2} & 2\textsuperscript{e}  \\
   \end{tabular}
\end{preview}
\end{document}
vincentb1 commented 9 years ago

Sorry Denis (@dbitouze) for that, the documentation contains a CheckSum and it is not updated automatically by the packaging (maybe we should improve that). This checksum has to be updated every time that a sty/def file is updated, and I had forgotten to do so, I will do it and let you know.

vincentb1 commented 9 years ago

To Denis (@dbitouze): Done, please try again — note that the documentation has not yet been updated as agreed.

dbitouze commented 9 years ago

@vincentb1 Now,

$ make install TEXMF_INSTALL_DIR=...

works as expected. But my remarks in https://github.com/nlct/fmtcount/issues/16#issuecomment-65090196 are still valid.

vincentb1 commented 9 years ago

Hello Denis @dbitouze,

It still does not look the same with pdflatex for two reasons:

So, in fact, as far as I understood, things can't look the same with pdflatex, you need xetex to be able to use real script glyphs.

What I understood is that, in case that there aren't real superscript, then frenchb uses its own emulation of superscripts looking closing to real superscript than the standard \textsuperscript one, hence the difference — maybe Daniel (@dflipo) can confirm.

What I was suggesting is only to document that with pdflatex there is going to be this difference.

    Vincent.

dbitouze commented 9 years ago

Le 02/12/14 à 09h37, Vincent Belaïche notifications@github.com a écrit :

Hello Denis @dbitouze,

Hello Vincent (@vincentb1),

It still does not look the same with pdflatex for two reasons:

  • First of all you do not use Erewhon within the \else part of the \ifxetex, so that will be Computer Modern, which as far as I understook from Daniel (@dflipo) does not have real superscripts. You shoud have had a \usepackage{erewhon} in the \else part.

It doesn't change anything.

  • Second, the realscripts package is also needed, but it seems that it is a XeTeX only package.

Indeed.

So, in fact, as far as I understood, things can't look the same with pdflatex, you need xetex to be able to use real script glyphs.

I guess things can look the same, see below.

What I understood is that, in case that there aren't real superscript, then frenchb uses its own emulation of superscripts looking closing to real superscript than the standard \textsuperscript one, hence the difference — maybe Daniel (@dflipo) can confirm.

Yes, that's what I also understood.

What I was suggesting is only to document that with pdflatex there is going to be this difference.

IMHO, it would be better that in any case, babel and fmtcount gives the same result because both 1\ier and \ordinalnum{1}, or 2\ieme and \ordinalnum{2}, may be used in the same document. Even if Daniel considers babel behavior is just a poor man's solution in case of font without real superscripts, it could be nice for fmtcount to make use

of \fup in babel's french language regions.

Denis

vincentb1 commented 9 years ago

In response to Denis' point below:

IMHO, it would be better that in any case, babel and fmtcount gives the same result because both 1\ier and \ordinalnum{1}, or 2\ieme and \ordinalnum{2}, may be used in the same document. Even if Daniel considers babel behavior is just a poor man's solution in case of font without real superscripts, it could be nice for fmtcount to make use of \fup in babel's french language regions.

What I propose is that I can make \fmtord behaviour language dependent (already approved by Nicola in this thread), and in the case of French use \fup if it exists and \textsuperscript otherwise.

I think that this way, that would make everybody happy.

    Vincent.

dbitouze commented 9 years ago

What I propose is that I can make \fmtord behaviour language dependent (already approved by Nicola in this thread),

OK.

and in the case of French use \fup if it exists

Who knows, maybe other packages do provide such a \fup macro. Hence I wouldn't rely on \fup existence but on "babel's french(b) current language".

and \textsuperscript otherwise.

OK.

I think that this way, that would make everybody happy.

If it is robust (see above), indeed!

dflipo commented 9 years ago

@vincentb1:

What I propose is that I can make |\fmtord| behaviour language
dependent (already approved by Nicola in this thread),

IMHO, the decision to print ordinals as superscripts or as normal letters should be language dependent, but I still believe that superscripts should look the same across all the languages used in the same document.

@dbitouze:

Who knows, maybe other packages do provide such a |\fup| macro. Hence I wouldn't rely on |\fup| existence but on "|babel|'s |french(b)| current language".

A robust test to decide whether frenchb.ldf is loaded or not (i.e \fup is defined), could be to check \AtBeginDocument whether the \FBsupR command is defined or not: it is a public command used in the definition of \fup, as such not liable to disappear in later versions of frenchb and not likely to be defined outside frenchb.ldf ;-)

Once you are sure \fup is defined, you can still check the current language if you prefer using \fup only in French.

Daniel Flipo

vincentb1 commented 9 years ago

In response to @dflipo's comment:

but I still believe that superscripts should look the same across all the languages used in the same document.

If we take the following constraints:

Then I have only the following two alternatives:

Please Denis @dbitouze, feedback on the above.

    Vincent.

dbitouze commented 9 years ago

@vincentb1 Even if I agree with @dflipo, the priority is that superscripts look the same within the same language hence look the same for fmtcount and babel in french. So, if it's OK for Nicola that superscripts look the same for all languages, I am for your first proposal.

vincentb1 commented 9 years ago

Dear Nicola @nlct,

To summarise, do you agree the two following changes:

To Daniel @dflipo, just to say that another alternative to the second point above would be that frenchb would use the plain LaTeX \textsuperscript instead of doing its own improved emulation of real scripts when they aren't there — yes this would be a slight degradation, but don't you agree that xelatex is the future anyway :stuck_out_tongue_winking_eye:.

    Vincent.

dflipo commented 9 years ago

@vincentb1:

If we take the following constraints:

  • We want the same superscript look for |fmtcount| and |babel| in |french|
  • We want the same superscript look for all languages

I just meant, that if \fup (in fact \FBupR) is available, \fup should be used for all languages in the document, and that \textsuperscript (for the whole document) would do otherwise.

  • There is not going to be any separate package to externalize |\fup| from |frenchb|

Then I have only the following two alternatives:

  • Either duplicate the code of |frenchb| so that |fmtcount| contains its own |\fup| — which I don't like very much, but I can accept to go this way,
  • Or I would load |frenchb| irrespective of the language — which I don't think is a good idea.

Neither of these two alternatives look great for me. I am ready to accept that the look of superscripts typeset by fmtcount look different depending on \FBupR being available or not (this means in /different/ documents) but it is up to the maintainers of fmtcount to decide whether this is acceptable or not.

Yet another option: when frenchb.ldf is loaded, you could add "\FBFrenchSuperscriptsfalse" so that \textsuperscript is used for all languages in all documents by frenchb and by fmtcount. Note that this proposal is suboptimal (if you consider that \fup does a better job than \textsuperscript) only when real superscripts are not available.

Daniel Flipo

vincentb1 commented 9 years ago

Hello,

Finally, I did it. There are two changes:

So now the reference minimal example below:

\documentclass[french]{minimal}
\usepackage{ifxetex}
\ifxetex
\usepackage{fontspec}
\setmainfont{Erewhon} % Free Utopia like font
\usepackage{realscripts}
\else
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{erewhon}
\fi
\usepackage{babel}
\usepackage{fmtcount}
\usepackage{array}
\usepackage[active,tightpage]{preview}
\begin{document}
\begin{preview}
\begin{tabular}{@{ }l@{ }l@{ }l@{ }}
babel&fmtcount&textsup.\\\hline
1\ier&\ordinalnum{1}&1\textsuperscript{er}\\
2\ieme&\ordinalnum{2}&2\textsuperscript{e}\\
\end{tabular}
\end{preview}
\end{document}

gives the following picture when compiled with latex (not xelatex): ecm

with babel & fmtcount doing the same thing.

If the compilation had been done with xelatex, then \textsuperscript would do the same as babel & fmtcount.

Joyeux Noël à tous !!

To @nlct : do you like the undefine third value for language dependent fmtord options: the purpose of it, is to fallback to the language-independent setting?

    Vincent.

vincentb1 commented 9 years ago
dflipo commented 9 years ago

Vincent (@vincentb1):

  • Question to Daniel (@dflipo https://github.com/dflipo): the test which I use for |\fup| or not |\fup| is simply |\ifcsundef{fup}|, is that enough, or should I test also whether |babel|/|frenchb| is loaded?

As Denis (@dbitouze) already pointed out: « maybe other packages do provide such a |\fup| macro ». Therefore I suggested to check for \FBsupR which /is/ frenchb specific as far as I know. Testing whether |babel|/|frenchb| is loaded, is another option.

Best,

Daniel Flipo

nlct commented 9 years ago

I'm sorry I haven't replied earlier. I've been trying to think of a way to improve the package and provide a better match with babel and polyglossia whilst maintaining backward compatibility. The problem is that the core fmtcount code was originally part of datetime, and that package was created before babel and was designed as a replacement to ukdate. It was later extended to work with babel, and the fmtcount was was split off into a separate package. Therefore the core code is extremely old, predates babel and has been extended well beyond its original design. I don't think that trying to continue to fix and patch it is the best way to go. I think it would be more efficient to make fmtcount obsolete and replace it with a more modular package. I have to catch a train this morning and will be away for a couple of weeks. I'll get back to you in the new year.

vincentb1 commented 9 years ago

Hello,

FYI, I have pushed to the repo a change as suggested by @dflipo (see his comment). In a nutshell I just replaced fup by FBsupR in the \ifcsundef arg #1 triggering which definition \fc@textsuperscript is let to.

Anyway, I don't like it very much: if there are several packages defining some \fup, then I had rather use some frenchb specific synonym of \fup — there don't seem to be any, that could be named \FB@fup in further versions of frenchb. Then I would just test that \FB@fup is defined, and if yes I would let \fc@textsuprtscript to it.

Well… let us wait for Nicola's further comments before doing anything. But I must admit after what I have just read from her, that I am rather conservative a guy, and I hate the idea of crushing everything and doing a bright new one. I would be ready to do that iff the pros and cons are listed and I can see a real benefit for it.

nlct commented 9 years ago

I wouldn't call replacing a package with a better designed package as crushing everything. Some things can be kept. There are two issues here: (1) separating the language-dependent aspects into independently maintained modules and (2) writing a better designed package. It's possible to achieve both without renaming the package but my concern is that this may cause compatibility issues. Users tend to get a bit annoyed if they upgrade their package only to find that their document doesn't compile any more. If modifications can be made without breaking backward compatibility then I'm fine with not renaming the package. However, regardless of whether or not a new package is required, these changes, especially (1) need implementing.

Currently fmtcount supports English (UK), French, German and Spanish. (Italian support is just an interface to itnumpar.) How many more languages will be added or should we simply say, "no that's enough"? Each new language increases the amount of code that needs to be installed. At the moment, a user who only ever uses one language still has to install all the fmtcount language support, even though they don't need all of it. It's worth noting that babel has also followed this route of separating the languages into independent modules. Each module needs to be maintained by someone fluent in that language and who knows the styles relevant to that language.

The other advantage in separating the languages into separate modules is that they can be uploaded to CTAN independently. If an issue is fixed in one module, it can straight away be uploaded to CTAN and get into the TeX distributions even if there are still issues that need fixing in the other modules. That way the fix is available to users without having to wait for the other issues to be resolved.

If you really want to keep fmtcount as a single monolithic package, then I'll have to step down as maintainer as I already have several large time-consuming packages to maintain.

vincentb1 commented 9 years ago

Dear Nicola,

I fully agree with your suggestion (1). Wouldn't it account basically to:

Maybe that is not the full story: currently fmtcount tries to load languages on the fly with best effort — no guarantee to succeed — when the use of a language is detected within the document body, but the language has not been statically loaded. So probably, if we want to keep this feature we need to keep the fc-xxxx.def as it is, and make fmtcount-xxxx.sty just a wrapper/loader for it.

Concerning (2), I think that this is a long term task to improve fmtcount, not only with respect to language independance. No revolution here. For instance with the correction of this issue #16, I have pushed some of the French specific code from fmtcount.sty to fc-french.def, which goes in the right direction.

   Vincent.

nlct commented 9 years ago

Hi Vincent,

We could adopt the approach I've used in the new datetime2 package. This first loads tracklang

\RequirePackage{tracklang}

This will pick up any language options the user has passed through the document class options list and it will also check for babel, polyglossia, translator and ngerman, and will pick up the requested languages from them (provided they have already been loaded). The main drawbacks are that tracklang can only pick up the root language not the regional variant from polyglossia and the user has to use \setmainlanguage and \setotherlanguage before tracklang is loaded. However, for the most part this is the simplest way of determining which languages the document uses. Additionally datetime2 passes any unknown options to tracklang using something like

\DeclareOption*{\TrackPredefinedDialect{\CurrentOption}}

So now the user can also specify the required languages in the package option list, if they want. The actual loading of the language dependent code is done using something like:

\AnyTrackedLanguages
{%
  \ForEachTrackedDialect{\this@dialect}%
 {%
    \@dtm@requiremodule\this@dialect
  }%
}
{%
  % no languages detect, apply some default setting
}

For fmtcount we'd need to replace datetime2's \@dtm@requiremodule with, say, \@fmt@requiremodule. (The commands \AnyTrackedLanguages and \ForEachTrackedDialect are provided by tracklang.) The \@dtm@requiremodule bit is defined as

\newcommand*{\@dtm@requiremodule}[1]{%
  \IfTrackedLanguageFileExists{#1}%
  {datetime2-}% prefix
  {.ldf}% suffix
  {%
    \RequireDateTimeModule{\CurrentTrackedTag}%
  }%
  {%
    \@dtm@warning{Date-Time Language Module `#1' not installed}%
  }%
}

We could adapt that for fmtcount using something like:

\newcommand*{\@fmt@requiremodule}[1]{%
  \IfTrackedLanguageFileExists{#1}%
  {fc-}% prefix
  {.def}% suffix
  {%
    \RequireFmtCountModule{\CurrentTrackedTag}%
  }%
  {%
    \PackageWarning{fmtcount}{fmtcount Language Module `#1' not installed}%
  }%
}

The \RequireFmtCountModule works in a similar manner to \RequirePackage. It prevents the file from being input if it's already been loaded. We can adapt the datetime2 command to something like:

\newcommand*{\RequireFmtCountModule}[1]{%
  \ifundef\CurrentTrackedDialect
  {%
    \PackageError{fmtcount}%
    {\string\RequireFmtCountModule\space not permitted here}%
    {This command is only permitted inside fmtcount language
    modules.}%
 }%
 {%
   \ifcsundef{ver@fc-#1.def}%
   {%
     \input{fc-#1.def}%
   }%
   {}%
 }%
}

The fc-xxxx.def files already identify themselves with \ProvidesFCLanguage so that replaces the equivalent \ProvidesDateTimeModule in datetime2.

The \IfTrackedLanguageFileExists bit (from tracklang) is the really useful one as then we don't need to worry about which of the various language synonyms that the user has used (for example, UKenglish or british or USenglish or american).

vincentb1 commented 9 years ago

Hello, After delivering v3.01 to CTAN, I close this issue, further discussion about language management improvement should go in another thread…