Closed vincentb1 closed 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
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:
ecm.tex
is the minimal complete example provided in the first commentecm.pdf
results from ecm.tex
via pdflatex
ecm.png
is the PNG picture inserted in the first comment.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.
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.
Or you (@nlct) could direct me to such a forum...
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:
\up
for French\textsuperscript
for EnglishFinal 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 ?
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-
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.
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.
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.
Daniel Flipo
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:
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:
\usepackage{realscripts}
\let\textsuperscript=\realsuperscript
immediately after the \begin{document}
Sorry for missing the point…
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}
Daniel Flipo
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
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
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:
All the superscripts are the same. So, what I propose is the following:
fmtcount
codePlease Denis (@dbitouze), you are the one who raised this: are you happy with my proposal?
Vincent.
@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
.
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.
It fails with (sorry: the following code block is not properly typeset, I don't know why):
/bin/bash: makedtx : unknown command
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
@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).
@vincentb1 Well, I am a bit lost. The following MWE:
1\ier
and \ordinalnum{1}
.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}
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.
To Denis (@dbitouze): Done, please try again — note that the documentation has not yet been updated as agreed.
@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.
Hello Denis @dbitouze,
It still does not look the same with pdflatex for two reasons:
\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.realscripts
package is also needed, but it seems that it is a XeTeX only package.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.
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
\fup
in babel
's french
language regions.Denis
In response to Denis' point below:
IMHO, it would be better that in any case,
babel
andfmtcount
gives the same result because both1\ier
and\ordinalnum{1}
, or2\ieme
and\ordinalnum{2}
, may be used in the same document. Even if Daniel considersbabel
behavior is just a poor man's solution in case of font without real superscripts, it could be nice forfmtcount
to make use of\fup
inbabel
'sfrench
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.
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!
@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
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:
fmtcount
and babel
in french
\fup
from frenchb
Then I have only the following two alternatives:
frenchb
so that fmtcount
contains its own \fup
— which I don't like very much, but I can accept to go this way,frenchb
irrespective of the language — which I don't think is a good idea.Please Denis @dbitouze, feedback on the above.
Vincent.
@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.
Dear Nicola @nlct,
To summarise, do you agree the two following changes:
\fmtord
option raise
or level
being language dependant — you already agree this one, didn't you?fmtcount
a copy (with some prefix renaming) of the \fup
implementation in frenchb
to replace \textsuperscript
. That will look slightly differently in pdflatex as opposed to xelatex with a font having real superscriptTo 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.
@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
Hello,
Finally, I did it. There are two changes:
\fup
is used when available instead of \textsuperscript
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):
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.
\fup
or not \fup
is simply \ifcsundef{fup}
, is that enough, or should I test also whether babel
/frenchb
is loaded?\fup
formatting of superscripts for other languages than French when frenchb
is loaded in a multilingual document? During the discussion there was some agreement that there is not any reason for having inconsistency of superscript formatting between languages, but you did not express your opinion… The consequence of this choice is that in a, say English, document, adding French to the loaded languages will slightly change the superscript formatting in other languages like English when compiling with latex (as opposed to xelatex + realscripts
package + some font with real scripts).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.
Daniel Flipo
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.
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.
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.
Dear Nicola,
I fully agree with your suggestion (1). Wouldn't it account basically to:
fc-xxxx.def
to fmtcount-xxxx.sty
, \ProvidesPackage{fmtcount-xxxx}
statement\RequirePackage
, rather than with an \input
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.
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
).
Hello, After delivering v3.01 to CTAN, I close this issue, further discussion about language management improvement should go in another thread…
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 thefrenchb
module ofbabel
.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:
You should get something like this: