Open fredrikpaues opened 1 year ago
I managed to figure out how to coerce fmtcount
into using my fc-swedish.def
.
I've managed to incorporate settings into fc-swedish.def
.
The settings are
one
which determines if "ett" (Swedish for "one") should be included for in front of "hundra" ("hundred") and "tusen" (thousand) whereby numbers such as 100, 1,000 and 1,100 are written as
one=neither
--- the default)one=hundred
)one=thousand
)one=both
)space
which determines if there should be space before and after the word "tusen" ("thousand") whereby a number such as 5,100 is written as
space=neither
)space=after
)space=both
)I have intentionally left out the option space=before
as that to the best of my knowledge is never done.
Also note that the two options interact. When one
is set to either neither
or hundred
, there is nothing in front of "tusen" and so a number such as 1,000 will be written as "tusen" regardless of the value of space
. (A number such as 21,000 will of course still be written as "tjugoen tusen" when space
is set to both
.)
As language options are only set up for the built-in languages (as noted in #48), a custom language such as Swedish seems to require some massaging. I've gotten it to work with the following setup.
\documentclass[swedish]{article}
\usepackage{babel}
\usepackage{fmtcount}
\FCloadlang{swedish}
\makeatletter
\define@key{fmtcount}{swedish}[]{%
\setkeys{fcswedish}{#1}%
}
\define@key{fcswedish}{fmtord}{%
\ifthenelse{\equal{#1}{raise}\or\equal{#1}{level}}{%
\expandafter\let\expandafter\@tempa\csname fc@set@ord@as@#1\endcsname
\expandafter\@tempa\csname fc@ord@swedish\endcsname
}{%
\ifthenelse{\equal{#1}{undefine}}{%
\expandafter\let\csname fc@ord@swedish\endcsname\undefined
}{%
\PackageError{fmtcount}%
{Invalid value `#1' to fmtord key}%
{Option `fmtord' can only take the values `level', `raise'
or `undefine'}%
}
}
}
\makeatother
\fmtcountsetoptions{swedish={one=hundred, space=both}}
\begin{document}
\newcounter{mycounter}
\setcounter{mycounter}{8} \themycounter\ \Numberstring{mycounter}\\
\end{document}
fc-swedish.def
\ProvidesFCLanguage{swedish}[2023/02/14]%
% % The four lines below should be uncommented for older pdfTeX versions
% \RequirePackage{iftex}
% \ifpdftex
% \RequirePackage[utf8]{inputenc}
% \RequirePackage[T1]{fontenc}
% \fi
% % The three lines below should be uncommented if the setup for Swedish language options is not done in `fmtcount.sty` or the .tex document
% \let\fc@swedishoptions@thousands@after\@empty
% \let\fc@swedishoptions@thousands@before\@empty
% \def\fc@swedishoptions@one{#1}
% LANGUAGE OPTIONS (begin)
% This section (together with SET DEFAULTS section at the bottom) must be commented out if the setup for Swedish language options is not done in `fmtcount.sty` or the .tex document
\ifcsundef{fc@gl@let}{\global\let\fc@gl@let\let}{\PackageError{fmtcount}{Command already defined}{Command
\protect\fc@gl@let\space already defined.}}
\ifcsundef{fc@gl@def}{\global\let\fc@gl@def\def}{\PackageError{fmtcount}{Command already defined}{Command
\protect\fc@gl@def\space already defined.}}
\define@choicekey*+{fcswedish}{space}[\val\nr]{neither,after,both}[neither]{%
\ifcase\nr\relax
\let\fc@swedishoptions@thousands@after\@empty
\let\fc@swedishoptions@thousands@before\@empty
\or
\let\fc@swedishoptions@thousands@after\space
\let\fc@swedishoptions@thousands@before\@empty
\or
\let\fc@swedishoptions@thousands@after\space
\let\fc@swedishoptions@thousands@before\space
\fi
}{%
\PackageError{fmtcount}{Invalid value `#1' to Swedish space key}{%
Swedish option `space' expects `neither', `after' or `both'%
}%
}%
\define@choicekey*+{fcswedish}{one}{neither,hundred,thousand,both}[neither]{%
\def\fc@swedishoptions@one{#1}
}{%
\PackageError{fmtcount}{Invalid value `#1' to Swedish one key}{%
Swedish option `one' expects `neither', `hundred', `thousand' or `both'
}%
}%
% LANGUAGE OPTIONS (end)
% \FCordinal
\newcommand{\@ordinalMswedish}[2]{%
\edef#2{\number#1\relax:e}%
}%
\global\let\@ordinalMswedish\@ordinalMswedish
\newcommand*\@ordinalFswedish[2]{%
\def\@fc@ord{}%
\@orgargctr=#1\relax
\@ordinalctr=#1%
\@FCmodulo{\@ordinalctr}{100}%
\ifnum\@ordinalctr=11\relax
\def\@fc@ord{:e}%
\else
\ifnum\@ordinalctr=12\relax
\def\@fc@ord{:e}%
\else
\@FCmodulo{\@ordinalctr}{10}%
\ifcase\@ordinalctr
\def\@fc@ord{:e}% case 0
\or \def\@fc@ord{:a}% case 1
\or \def\@fc@ord{:a}% case 2
\else
\def\@fc@ord{:e}% default case
\fi
\fi
\fi
\edef#2{\number#1\relax\noexpand\@fc@ord}% The ordinal suffix is never raised in Swedish
}%
\global\let\@ordinalFswedish\@ordinalFswedish
\global\let\@ordinalNswedish\@ordinalFswedish
% \numberstring
\newcommand*\@@unitstringMswedish[1]{%
\ifcase#1%
noll%
\or en%
\or två%
\or tre%
\or fyra%
\or fem%
\or sex%
\or sju%
\or åtta%
\or nio%
\fi
}%
\global\let\@@unitstringMswedish\@@unitstringMswedish
\global\let\@@unitstringFswedish\@@unitstringMswedish
\newcommand*\@@unitstringNswedish[1]{%
\ifcase#1%
noll%
\or ett%
\or två%
\or tre%
\or fyra%
\or fem%
\or sex%
\or sju%
\or åtta%
\or nio%
\fi
}%
\global\let\@@unitstringNswedish\@@unitstringNswedish
\newcommand*\@@tenstringswedish[1]{%
\ifcase#1%
\or tio%
\or tjugo%
\or trettio%
\or fyrtio%
\or femtio%
\or sextio%
\or sjuttio%
\or åttio%
\or nittio%
\or etthundra%
\fi
}%
\global\let\@@tenstringswedish\@@tenstringswedish
\newcommand*\@@teenstringswedish[1]{%
\ifcase#1%
tio%
\or elva%
\or tolv%
\or tretton%
\or fjorton%
\or femton%
\or sexton%
\or sjutton%
\or arton%
\or nitton%
\fi
}%
\global\let\@@teenstringswedish\@@teenstringswedish
\newcommand*\@@numberunderhundredswedish[2]{%
\ifnum#1>99\relax
\PackageError{fmtcount}{Out of range}%
{This submacro should only deal with values less than 100}%
\fi
\ifnum#1<10\relax
\eappto#2{\@unitstring{#1}}%
\else
\ifnum#1<20\relax
\@tmpstrctr=#1\relax
\@FCmodulo{\@tmpstrctr}{10}%
\eappto#2{\@teenstring{\@tmpstrctr}}%
\else
% tens
\@tmpstrctr=#1\relax
\divide\@tmpstrctr by 10\relax
\eappto#2{\@tenstring{\@tmpstrctr}}%
% singles
\@tmpstrctr=#1\relax
\@FCmodulo{\@tmpstrctr}{10}%
\ifnum\@tmpstrctr>0\relax
\eappto#2{\@unitstring{\@tmpstrctr}}%
\fi
\fi
\fi
}%
\global\let\@@numberunderhundredswedish\@@numberunderhundredswedish
\newcommand*\@@numberstringswedish[2]{%
\ifnum#1>99999\relax
\PackageError{fmtcount}{Out of range}%
{This macro only works for values less than 100000}%
\fi
\ifnum#1<0\relax
\PackageError{fmtcount}{Negative numbers not permitted}%
{This macro does not work for negative numbers, however
you can try typing "minus" first, and then pass the modulus of
this number}%
\fi
% Incorporate language options
\show\fc@swedishoptions@one
\ifthenelse{\equal{\fc@swedishoptions@one}{neither}}{%
\def\fc@swedishoptions@one@hundred{hundra}
\def\fc@swedishoptions@one@thousand{tusen}
}{%
\ifthenelse{\equal{\fc@swedishoptions@one}{hundred}}{%
\def\fc@swedishoptions@one@hundred{etthundra}
\def\fc@swedishoptions@one@thousand{tusen}
}{%
\ifthenelse{\equal{\fc@swedishoptions@one}{thousand}}{%
\def\fc@swedishoptions@one@hundred{hundra}
\ifthenelse{\equal{\fc@swedishoptions@thousands@before}{\space}}{%
\def\fc@swedishoptions@one@thousand{ett tusen}
}{%
\def\fc@swedishoptions@one@thousand{ettusen}
}
}{%both
\def\fc@swedishoptions@one@hundred{etthundra}
\ifthenelse{\equal{\fc@swedishoptions@thousands@before}{\space}}{%
\def\fc@swedishoptions@one@thousand{ett tusen}
}{%
\def\fc@swedishoptions@one@thousand{ettusen}
}
}%
}%
}%
\show\fc@swedishoptions@one@hundred
\show\fc@swedishoptions@one@thousand
% Initialize
\def#2{}%
% Thousands
\@strctr=#1\relax
\divide\@strctr by 1000\relax
\ifnum\@strctr>0\relax
\ifnum\@strctr=1\relax
\eappto#2{\fc@swedishoptions@one@thousand}%
\else
\let\@tmpunitstring\@unitstring% Temporary store gendered unit string
\let\@unitstring\@@unitstringMswedish% Thousands above 1 are given in "masculine" units (21,000 is "tjugoentusen" and not "tjugoettusen")
\@@numberunderhundredswedish{\@strctr}{#2}%
\let\@unitstring\@tmpunitstring% Restore gendered unit string
\eappto#2{\fc@swedishoptions@thousands@before}%
\appto#2{tusen}%
\fi
\@strctr=#1\relax
\@FCmodulo{\@strctr}{1000}%
\ifnum\@strctr>0\relax
\eappto#2{\fc@swedishoptions@thousands@after}%
\fi
\fi
% Hundreds
\@strctr=#1\relax
\@FCmodulo{\@strctr}{1000}%
\divide\@strctr by 100\relax
\ifnum\@strctr>0\relax
\ifnum\@strctr=1\relax
\eappto#2{\fc@swedishoptions@one@hundred}%
\else
\eappto#2{\@unitstring{\@strctr}}%
\appto#2{hundra}%
\fi
\fi
% Tens and singles
\@strctr=#1\relax
\@FCmodulo{\@strctr}{100}%
\ifnum\@strctr>0\relax% Trailing zeros are silent
\@@numberunderhundredswedish{\@strctr}{#2}%
\else
\ifnum#1=0\relax% Unless the number is in fact 0
\eappto#2{\@unitstring{\@strctr}}%
\fi
\fi
}%
\global\let\@@numberstringswedish\@@numberstringswedish
\newcommand*{\@numberstringMswedish}[2]{%
\let\@unitstring\@@unitstringMswedish
\let\@teenstring\@@teenstringswedish
\let\@tenstring\@@tenstringswedish
\@@numberstringswedish{#1}{#2}%
}%
\global\let\@numberstringMswedish\@numberstringMswedish
\global\let\@numberstringFswedish\@numberstringMswedish
\newcommand*{\@numberstringNswedish}[2]{%
\let\@unitstring\@@unitstringNswedish
\let\@teenstring\@@teenstringswedish
\let\@tenstring\@@tenstringswedish
\@@numberstringswedish{#1}{#2}%
}%
\newcommand*{\@NumberstringMswedish}[2]{%
\@numberstringMswedish{#1}{\@@num@str}%
\edef#2{\MakeTitlecase{\@@num@str}}%
}%
\global\let\@NumberstringMswedish\@NumberstringMswedish
\global\let\@NumberstringFswedish\@NumberstringMswedish
\newcommand*{\@NumberstringNswedish}[2]{%
\@numberstringNswedish{#1}{\@@num@str}%
\edef#2{\MakeTitlecase{\@@num@str}}%
}%
\global\let\@NumberstringNswedish\@NumberstringNswedish
% ordinalstring
\newcommand*\@@unitthstringMswedish[1]{%
\ifcase#1%
nollte%
\or förste%
\or andre%
\or tredje%
\or fjärde%
\or femte%
\or sjätte%
\or sjunde%
\or åttonde%
\or nionde%
\fi
}%
\global\let\@@unitthstringMswedish\@@unitthstringMswedish
\newcommand*\@@unitthstringFswedish[1]{%
\ifcase#1%
nollte%
\or första%
\or andra%
\or tredje%
\or fjärde%
\or femte%
\or sjätte%
\or sjunde%
\or åttonde%
\or nionde%
\fi
}%
\global\let\@@unitthstringFswedish\@@unitthstringFswedish
\global\let\@@unitthstringNswedish\@@unitthstringFswedish
\newcommand*\@@tenthstringswedish[1]{%
\ifcase#1%
\or tionde%
\or tjugonde%
\or trettionde%
\or fyrtionde%
\or femtionde%
\or sextionde%
\or sjuttionde%
\or åttionde%
\or nittionde%
\fi
}%
\global\let\@@tenthstringswedish\@@tenthstringswedish
\newcommand*\@@teenthstringswedish[1]{%
\ifcase#1%
tionde%
\or elfte%
\or tolfte%
\or trettonde%
\or fjortonde%
\or femtonde%
\or sextonde%
\or sjuttonde%
\or artonde%
\or nittonde%
\fi
}%
\global\let\@@teenthstringswedish\@@teenthstringswedish
\newcommand*\@@numberunderhundredthswedish[2]{%
\ifnum#1<10\relax
\eappto#2{\@unitthstring{#1}}%
\else
\@tmpstrctr=#1\relax
\@FCmodulo{\@tmpstrctr}{10}%
\ifnum#1<20\relax
\eappto#2{\@teenthstring{\@tmpstrctr}}%
\else
\ifnum\@tmpstrctr=0\relax
\@tmpstrctr=#1\relax
\divide\@tmpstrctr by 10\relax
\eappto#2{\@tenthstring{\@tmpstrctr}}%
\else
\@tmpstrctr=#1\relax
\divide\@tmpstrctr by 10\relax
\eappto#2{\@tenstring{\@tmpstrctr}}%
\@tmpstrctr=#1\relax
\@FCmodulo{\@tmpstrctr}{10}%
\eappto#2{\@unitthstring{\@tmpstrctr}}%
\fi
\fi
\fi
}%
\global\let\@@numberunderhundredthswedish\@@numberunderhundredthswedish
\newcommand*\@@ordinalstringswedish[2]{%
\ifnum\@orgargctr>99999\relax
\PackageError{fmtcount}{Out of range}%
{This macro only works for values less than 100000}%
\fi
\ifnum\@orgargctr<0\relax
\PackageError{fmtcount}{Negative numbers not permitted}%
{This macro does not work for negative numbers, however
you can try typing "minus" first, and then pass the modulus of
this number}%
\fi
% Incorporate language options
\ifthenelse{\equal{\fc@swedishoptions@one}{neither}}{%
\def\fc@swedishoptions@one@hundred{hundra}
\def\fc@swedishoptions@one@hundredth{hundrade}
\def\fc@swedishoptions@one@thousand{tusen}
\def\fc@swedishoptions@one@thousandth{tusende}
}{%
\ifthenelse{\equal{\fc@swedishoptions@one}{hundred}}{%
\def\fc@swedishoptions@one@hundred{etthundra}
\def\fc@swedishoptions@one@hundredth{etthundrade}
\def\fc@swedishoptions@one@thousand{tusen}
\def\fc@swedishoptions@one@thousandth{tusende}
}{%
\ifthenelse{\equal{\fc@swedishoptions@one}{thousand}}{%
\def\fc@swedishoptions@one@hundred{hundra}
\def\fc@swedishoptions@one@hundredth{hundrade}
\ifthenelse{\equal{\fc@swedishoptions@thousands@before}{\space}}{%
\def\fc@swedishoptions@one@thousand{ett tusen}
\def\fc@swedishoptions@one@thousandth{ett tusende}
}{%
\def\fc@swedishoptions@one@thousand{ettusen}
\def\fc@swedishoptions@one@thousandth{ettusende}
}
}{%both
\def\fc@swedishoptions@one@hundred{etthundra}
\def\fc@swedishoptions@one@hundredth{etthundrade}
\ifthenelse{\equal{\fc@swedishoptions@thousands@before}{\space}}{%
\def\fc@swedishoptions@one@thousand{ett tusen}
\def\fc@swedishoptions@one@thousandth{ett tusende}
}{%
\def\fc@swedishoptions@one@thousand{ettusen}
\def\fc@swedishoptions@one@thousandth{ettusende}
}
}%
}%
}%
% Initialize
\def#2{}%
% Thousands
\@strctr=#1\relax
\divide\@strctr by 1000\relax
\ifnum\@strctr>0\relax
\ifnum\@strctr=1\relax
\@strctr=#1\relax
\@FCmodulo{\@strctr}{1000}%
\ifnum\@strctr>0\relax
\eappto#2{\fc@swedishoptions@one@thousand}%
\eappto#2{\fc@swedishoptions@thousands@after}%
\else
\eappto#2{\fc@swedishoptions@one@thousandth}%
\fi
\else
\let\@tmpunitstring\@unitstring% Temporary store gendered unit string
\let\@unitstring\@@unitstringMswedish% Thousands above 1 are given in "masculine" units (21,000 is "tjugoentusen" and not "tjugoettusen")
\@@numberunderhundredswedish{\@strctr}{#2}%
\let\@unitstring\@tmpunitstring% Restore gendered unit string
\eappto#2{\fc@swedishoptions@thousands@before}%
\@strctr=#1\relax
\@FCmodulo{\@strctr}{1000}%
\ifnum\@strctr>0\relax
\appto#2{tusen}%
\eappto#2{\fc@swedishoptions@thousands@after}%
\else
\appto#2{tusende}%
\fi
\fi
\fi
% Hundreds
\@strctr=#1
\@FCmodulo{\@strctr}{1000}%
\divide\@strctr by 100\relax
\ifnum\@strctr>0\relax
\ifnum\@strctr=1\relax
\@strctr=#1\relax
\@FCmodulo{\@strctr}{100}%
\ifnum\@strctr>0\relax
\eappto#2{\fc@swedishoptions@one@hundred}%
\else
\eappto#2{\fc@swedishoptions@one@hundredth}%
\fi
\else
\eappto#2{\@unitstring{\@strctr}}% Hundreds are given in "neutrum" units
\@strctr=#1\relax
\@FCmodulo{\@strctr}{100}%
\ifnum\@strctr>0\relax
\appto#2{hundra}%
\else
\appto#2{hundrade}%
\fi
\fi
\fi
% Tens and singles
\@strctr=#1\relax
\@FCmodulo{\@strctr}{100}%
\ifnum\@strctr>0\relax% Trailing zeros are silent
\@@numberunderhundredthswedish{\@strctr}{#2}%
\else
\ifnum#1=0\relax% Unless the number is in fact 0
\eappto#2{\@unitthstring{\@strctr}}%
\fi
\fi
}%
\global\let\@@ordinalstringswedish\@@ordinalstringswedish
\newcommand*{\@ordinalstringMswedish}[2]{%
\let\@unitthstring\@@unitthstringMswedish
\let\@teenthstring\@@teenthstringswedish
\let\@tenthstring\@@tenthstringswedish
\let\@unitstring\@@unitstringMswedish
\let\@teenstring\@@teenstringswedish
\let\@tenstring\@@tenstringswedish
\@@ordinalstringswedish{#1}{#2}%
}%
\global\let\@ordinalstringMswedish\@ordinalstringMswedish
\newcommand*{\@ordinalstringFswedish}[2]{%
\let\@unitthstring\@@unitthstringFswedish
\let\@teenthstring\@@teenthstringswedish
\let\@tenthstring\@@tenthstringswedish
\let\@unitstring\@@unitstringMswedish
\let\@teenstring\@@teenstringswedish
\let\@tenstring\@@tenstringswedish
\@@ordinalstringswedish{#1}{#2}%
}%
\global\let\@ordinalstringFswedish\@ordinalstringFswedish
\global\let\@ordinalstringNswedish\@ordinalstringFswedish
\newcommand*{\@OrdinalstringMswedish}[2]{%
\@ordinalstringMswedish{#1}{\@@num@str}%
\edef#2{\MakeTitlecase{\@@num@str}}%
}%
\global\let\@OrdinalstringMswedish\@OrdinalstringMswedish
\newcommand*{\@OrdinalstringFswedish}[2]{%
\@ordinalstringFswedish{#1}{\@@num@str}%
\edef#2{\MakeTitlecase{\@@num@str}}%
}%
\global\let\@OrdinalstringFswedish\@OrdinalstringFswedish
\newcommand*{\@OrdinalstringNswedish}[2]{%
\@ordinalstringNswedish{#1}{\@@num@str}%
\edef#2{\MakeTitlecase{\@@num@str}}%
}%
\global\let\@OrdinalstringNswedish\@OrdinalstringNswedish
% SET DEFAULTS (begin)
% This section (together with LANGUAGE OPTIONS section at the top) must be commented out if the setup for Swedish language options is not done in `fmtcount.sty` or the .tex document
\newcommand*\fc@swedishoptions@setdefaults{%
\fc@gl@let\fc@swedishoptions@thousands@after\@empty%
\fc@gl@let\fc@swedishoptions@thousands@before\@empty%
\fc@gl@def\fc@swedishoptions@one{neither}%
}%
\global\let\fc@swedishoptions@setdefaults\fc@swedishoptions@setdefaults
{%
\let\fc@gl@def\gdef
\def\fc@gl@let{\global\let}%
\fc@swedishoptions@setdefaults
}%
% SET DEFAULTS (end)
\iffalse Local variables: \fi
\iffalse mode: docTeX \fi
\iffalse End: \fi
\endinput
Thanks to an answer on TeXSE by @eg9, here is an updated version that gets rid of some pesky spaces
\ProvidesFCLanguage{swedish}[2023/02/14]%
% % The four lines below should be uncommented for older pdfTeX versions
% \RequirePackage{iftex}
% \ifpdftex
% \RequirePackage[utf8]{inputenc}
% \RequirePackage[T1]{fontenc}
% \fi
% % The three lines below should be uncommented if the setup for Swedish language options is not done in `fmtcount.sty` or the .tex document
% \let\fc@swedishoptions@thousands@after\@empty
% \let\fc@swedishoptions@thousands@before\@empty
% \def\fc@swedishoptions@one{#1}
% LANGUAGE OPTIONS (begin)
% This section (together with SET DEFAULTS section at the bottom) must be commented out if the setup for Swedish language options is not done in `fmtcount.sty` or the .tex document
\ifcsundef{fc@gl@let}{\global\let\fc@gl@let\let}{\PackageError{fmtcount}{Command already defined}{Command
\protect\fc@gl@let\space already defined.}}
\ifcsundef{fc@gl@def}{\global\let\fc@gl@def\def}{\PackageError{fmtcount}{Command already defined}{Command
\protect\fc@gl@def\space already defined.}}
\define@choicekey*+{fcswedish}{space}[\val\nr]{neither,after,both}[neither]{%
\ifcase\nr\relax
\let\fc@swedishoptions@thousands@after\@empty
\let\fc@swedishoptions@thousands@before\@empty
\or
\let\fc@swedishoptions@thousands@after\space
\let\fc@swedishoptions@thousands@before\@empty
\or
\let\fc@swedishoptions@thousands@after\space
\let\fc@swedishoptions@thousands@before\space
\fi
}{%
\PackageError{fmtcount}{Invalid value `#1' to Swedish space key}{%
Swedish option `space' expects `neither', `after' or `both'%
}%
}%
\define@choicekey*+{fcswedish}{one}{neither,hundred,thousand,both}[neither]{%
\def\fc@swedishoptions@one{#1}
}{%
\PackageError{fmtcount}{Invalid value `#1' to Swedish one key}{%
Swedish option `one' expects `neither', `hundred', `thousand' or `both'
}%
}%
% LANGUAGE OPTIONS (end)
% \FCordinal
\newcommand{\@ordinalMswedish}[2]{%
\edef#2{\number#1\relax:e}%
}%
\global\let\@ordinalMswedish\@ordinalMswedish
\newcommand*\@ordinalFswedish[2]{%
\def\@fc@ord{}%
\@orgargctr=#1\relax
\@ordinalctr=#1\relax
\@FCmodulo{\@ordinalctr}{100}%
\ifnum\@ordinalctr=11\relax
\def\@fc@ord{:e}%
\else
\ifnum\@ordinalctr=12\relax
\def\@fc@ord{:e}%
\else
\@FCmodulo{\@ordinalctr}{10}%
\ifcase\@ordinalctr
\def\@fc@ord{:e}% case 0
\or \def\@fc@ord{:a}% case 1
\or \def\@fc@ord{:a}% case 2
\else
\def\@fc@ord{:e}% default case
\fi
\fi
\fi
\edef#2{\number#1\relax\noexpand\@fc@ord}% The ordinal suffix is never raised in Swedish
}%
\global\let\@ordinalFswedish\@ordinalFswedish
\global\let\@ordinalNswedish\@ordinalFswedish
% \numberstring
\newcommand*\@@unitstringMswedish[1]{%
\ifcase#1%
noll%
\or en%
\or två%
\or tre%
\or fyra%
\or fem%
\or sex%
\or sju%
\or åtta%
\or nio%
\fi
}%
\global\let\@@unitstringMswedish\@@unitstringMswedish
\global\let\@@unitstringFswedish\@@unitstringMswedish
\newcommand*\@@unitstringNswedish[1]{%
\ifcase#1%
noll%
\or ett%
\or två%
\or tre%
\or fyra%
\or fem%
\or sex%
\or sju%
\or åtta%
\or nio%
\fi
}%
\global\let\@@unitstringNswedish\@@unitstringNswedish
\newcommand*\@@tenstringswedish[1]{%
\ifcase#1%
\or tio%
\or tjugo%
\or trettio%
\or fyrtio%
\or femtio%
\or sextio%
\or sjuttio%
\or åttio%
\or nittio%
\or etthundra%
\fi
}%
\global\let\@@tenstringswedish\@@tenstringswedish
\newcommand*\@@teenstringswedish[1]{%
\ifcase#1%
tio%
\or elva%
\or tolv%
\or tretton%
\or fjorton%
\or femton%
\or sexton%
\or sjutton%
\or arton%
\or nitton%
\fi
}%
\global\let\@@teenstringswedish\@@teenstringswedish
\newcommand*\@@numberunderhundredswedish[2]{%
\ifnum#1>99\relax
\PackageError{fmtcount}{Out of range}%
{This submacro should only deal with values less than 100}%
\fi
\ifnum#1<10\relax
\eappto#2{\@unitstring{#1}}%
\else
\ifnum#1<20\relax
\@tmpstrctr=#1\relax
\@FCmodulo{\@tmpstrctr}{10}%
\eappto#2{\@teenstring{\@tmpstrctr}}%
\else
% tens
\@tmpstrctr=#1\relax
\divide\@tmpstrctr by 10\relax
\eappto#2{\@tenstring{\@tmpstrctr}}%
% singles
\@tmpstrctr=#1\relax
\@FCmodulo{\@tmpstrctr}{10}%
\ifnum\@tmpstrctr>0\relax
\eappto#2{\@unitstring{\@tmpstrctr}}%
\fi
\fi
\fi
}%
\global\let\@@numberunderhundredswedish\@@numberunderhundredswedish
\newcommand*\@@numberstringswedish[2]{%
\ifnum#1>99999\relax
\PackageError{fmtcount}{Out of range}%
{This macro only works for values less than 100000}%
\fi
\ifnum#1<0\relax
\PackageError{fmtcount}{Negative numbers not permitted}%
{This macro does not work for negative numbers, however
you can try typing "minus" first, and then pass the modulus of
this number}%
\fi
% Incorporate language options
\ifthenelse{\equal{\fc@swedishoptions@one}{neither}}{%
\def\fc@swedishoptions@one@hundred{hundra}%
\def\fc@swedishoptions@one@thousand{tusen}%
}{%
\ifthenelse{\equal{\fc@swedishoptions@one}{hundred}}{%
\def\fc@swedishoptions@one@hundred{etthundra}%
\def\fc@swedishoptions@one@thousand{tusen}%
}{%
\ifthenelse{\equal{\fc@swedishoptions@one}{thousand}}{%
\def\fc@swedishoptions@one@hundred{hundra}%
\ifthenelse{\equal{\fc@swedishoptions@thousands@before}{\space}}{%
\def\fc@swedishoptions@one@thousand{ett tusen}%
}{%
\def\fc@swedishoptions@one@thousand{ettusen}%
}%
}{%both
\def\fc@swedishoptions@one@hundred{etthundra}%
\ifthenelse{\equal{\fc@swedishoptions@thousands@before}{\space}}{%
\def\fc@swedishoptions@one@thousand{ett tusen}%
}{%
\def\fc@swedishoptions@one@thousand{ettusen}%
}%
}%
}%
}%
% Initialize
\def#2{}%
% Thousands
\@strctr=#1\relax
\divide\@strctr by 1000\relax
\ifnum\@strctr>0\relax
\ifnum\@strctr=1\relax
\eappto#2{\fc@swedishoptions@one@thousand}%
\else
\let\@tmpunitstring\@unitstring% Temporary store gendered unit string
\let\@unitstring\@@unitstringMswedish% Thousands above 1 are given in "masculine" units (21,000 is "tjugoentusen" and not "tjugoettusen")
\@@numberunderhundredswedish{\@strctr}{#2}%
\let\@unitstring\@tmpunitstring% Restore gendered unit string
\eappto#2{\fc@swedishoptions@thousands@before}%
\appto#2{tusen}%
\fi
\@strctr=#1\relax
\@FCmodulo{\@strctr}{1000}%
\ifnum\@strctr>0\relax
\eappto#2{\fc@swedishoptions@thousands@after}%
\fi
\fi
% Hundreds
\@strctr=#1\relax
\@FCmodulo{\@strctr}{1000}%
\divide\@strctr by 100\relax
\ifnum\@strctr>0\relax
\ifnum\@strctr=1\relax
\eappto#2{\fc@swedishoptions@one@hundred}%
\else
\eappto#2{\@unitstring{\@strctr}}%
\appto#2{hundra}%
\fi
\fi
% Tens and singles
\@strctr=#1\relax
\@FCmodulo{\@strctr}{100}%
\ifnum\@strctr>0\relax% Trailing zeros are silent
\@@numberunderhundredswedish{\@strctr}{#2}%
\else
\ifnum#1=0\relax% Unless the number is in fact 0
\eappto#2{\@unitstring{\@strctr}}%
\fi
\fi
}%
\global\let\@@numberstringswedish\@@numberstringswedish
\newcommand*{\@numberstringMswedish}[2]{%
\let\@unitstring\@@unitstringMswedish
\let\@teenstring\@@teenstringswedish
\let\@tenstring\@@tenstringswedish
\@@numberstringswedish{#1}{#2}%
}%
\global\let\@numberstringMswedish\@numberstringMswedish
\global\let\@numberstringFswedish\@numberstringMswedish
\newcommand*{\@numberstringNswedish}[2]{%
\let\@unitstring\@@unitstringNswedish
\let\@teenstring\@@teenstringswedish
\let\@tenstring\@@tenstringswedish
\@@numberstringswedish{#1}{#2}%
}%
\newcommand*{\@NumberstringMswedish}[2]{%
\@numberstringMswedish{#1}{\@@num@str}%
\edef#2{\MakeTitlecase{\@@num@str}}%
}%
\global\let\@NumberstringMswedish\@NumberstringMswedish
\global\let\@NumberstringFswedish\@NumberstringMswedish
\newcommand*{\@NumberstringNswedish}[2]{%
\@numberstringNswedish{#1}{\@@num@str}%
\edef#2{\MakeTitlecase{\@@num@str}}%
}%
\global\let\@NumberstringNswedish\@NumberstringNswedish
% ordinalstring
\newcommand*\@@unitthstringMswedish[1]{%
\ifcase#1%
nollte%
\or förste%
\or andre%
\or tredje%
\or fjärde%
\or femte%
\or sjätte%
\or sjunde%
\or åttonde%
\or nionde%
\fi
}%
\global\let\@@unitthstringMswedish\@@unitthstringMswedish
\newcommand*\@@unitthstringFswedish[1]{%
\ifcase#1%
nollte%
\or första%
\or andra%
\or tredje%
\or fjärde%
\or femte%
\or sjätte%
\or sjunde%
\or åttonde%
\or nionde%
\fi
}%
\global\let\@@unitthstringFswedish\@@unitthstringFswedish
\global\let\@@unitthstringNswedish\@@unitthstringFswedish
\newcommand*\@@tenthstringswedish[1]{%
\ifcase#1%
\or tionde%
\or tjugonde%
\or trettionde%
\or fyrtionde%
\or femtionde%
\or sextionde%
\or sjuttionde%
\or åttionde%
\or nittionde%
\fi
}%
\global\let\@@tenthstringswedish\@@tenthstringswedish
\newcommand*\@@teenthstringswedish[1]{%
\ifcase#1%
tionde%
\or elfte%
\or tolfte%
\or trettonde%
\or fjortonde%
\or femtonde%
\or sextonde%
\or sjuttonde%
\or artonde%
\or nittonde%
\fi
}%
\global\let\@@teenthstringswedish\@@teenthstringswedish
\newcommand*\@@numberunderhundredthswedish[2]{%
\ifnum#1<10\relax
\eappto#2{\@unitthstring{#1}}%
\else
\@tmpstrctr=#1\relax
\@FCmodulo{\@tmpstrctr}{10}%
\ifnum#1<20\relax
\eappto#2{\@teenthstring{\@tmpstrctr}}%
\else
\ifnum\@tmpstrctr=0\relax
\@tmpstrctr=#1\relax
\divide\@tmpstrctr by 10\relax
\eappto#2{\@tenthstring{\@tmpstrctr}}%
\else
\@tmpstrctr=#1\relax
\divide\@tmpstrctr by 10\relax
\eappto#2{\@tenstring{\@tmpstrctr}}%
\@tmpstrctr=#1\relax
\@FCmodulo{\@tmpstrctr}{10}%
\eappto#2{\@unitthstring{\@tmpstrctr}}%
\fi
\fi
\fi
}%
\global\let\@@numberunderhundredthswedish\@@numberunderhundredthswedish
\newcommand*\@@ordinalstringswedish[2]{%
\ifnum\@orgargctr>99999\relax
\PackageError{fmtcount}{Out of range}%
{This macro only works for values less than 100000}%
\fi
\ifnum\@orgargctr<0\relax
\PackageError{fmtcount}{Negative numbers not permitted}%
{This macro does not work for negative numbers, however
you can try typing "minus" first, and then pass the modulus of
this number}%
\fi
% Incorporate language options
\ifthenelse{\equal{\fc@swedishoptions@one}{neither}}{%
\def\fc@swedishoptions@one@hundred{hundra}%
\def\fc@swedishoptions@one@hundredth{hundrade}%
\def\fc@swedishoptions@one@thousand{tusen}%
\def\fc@swedishoptions@one@thousandth{tusende}%
}{%
\ifthenelse{\equal{\fc@swedishoptions@one}{hundred}}{%
\def\fc@swedishoptions@one@hundred{etthundra}%
\def\fc@swedishoptions@one@hundredth{etthundrade}%
\def\fc@swedishoptions@one@thousand{tusen}%
\def\fc@swedishoptions@one@thousandth{tusende}%
}{%
\ifthenelse{\equal{\fc@swedishoptions@one}{thousand}}{%
\def\fc@swedishoptions@one@hundred{hundra}%
\def\fc@swedishoptions@one@hundredth{hundrade}%
\ifthenelse{\equal{\fc@swedishoptions@thousands@before}{\space}}{%
\def\fc@swedishoptions@one@thousand{ett tusen}%
\def\fc@swedishoptions@one@thousandth{ett tusende}%
}{%
\def\fc@swedishoptions@one@thousand{ettusen}%
\def\fc@swedishoptions@one@thousandth{ettusende}%
}%
}{%both
\def\fc@swedishoptions@one@hundred{etthundra}%
\def\fc@swedishoptions@one@hundredth{etthundrade}%
\ifthenelse{\equal{\fc@swedishoptions@thousands@before}{\space}}{%
\def\fc@swedishoptions@one@thousand{ett tusen}%
\def\fc@swedishoptions@one@thousandth{ett tusende}%
}{%
\def\fc@swedishoptions@one@thousand{ettusen}%
\def\fc@swedishoptions@one@thousandth{ettusende}%
}%
}%
}%
}%
% Initialize
\def#2{}%
% Thousands
\@strctr=#1\relax
\divide\@strctr by 1000\relax
\ifnum\@strctr>0\relax
\ifnum\@strctr=1\relax
\@strctr=#1\relax
\@FCmodulo{\@strctr}{1000}%
\ifnum\@strctr>0\relax
\eappto#2{\fc@swedishoptions@one@thousand}%
\eappto#2{\fc@swedishoptions@thousands@after}%
\else
\eappto#2{\fc@swedishoptions@one@thousandth}%
\fi
\else
\let\@tmpunitstring\@unitstring% Temporary store gendered unit string
\let\@unitstring\@@unitstringMswedish% Thousands above 1 are given in "masculine" units (21,000 is "tjugoentusen" and not "tjugoettusen")
\@@numberunderhundredswedish{\@strctr}{#2}%
\let\@unitstring\@tmpunitstring% Restore gendered unit string
\eappto#2{\fc@swedishoptions@thousands@before}%
\@strctr=#1\relax
\@FCmodulo{\@strctr}{1000}%
\ifnum\@strctr>0\relax
\appto#2{tusen}%
\eappto#2{\fc@swedishoptions@thousands@after}%
\else
\appto#2{tusende}%
\fi
\fi
\fi
% Hundreds
\@strctr=#1
\@FCmodulo{\@strctr}{1000}%
\divide\@strctr by 100\relax
\ifnum\@strctr>0\relax
\ifnum\@strctr=1\relax
\@strctr=#1\relax
\@FCmodulo{\@strctr}{100}%
\ifnum\@strctr>0\relax
\eappto#2{\fc@swedishoptions@one@hundred}%
\else
\eappto#2{\fc@swedishoptions@one@hundredth}%
\fi
\else
\eappto#2{\@unitstring{\@strctr}}% Hundreds are given in "neutrum" units
\@strctr=#1\relax
\@FCmodulo{\@strctr}{100}%
\ifnum\@strctr>0\relax
\appto#2{hundra}%
\else
\appto#2{hundrade}%
\fi
\fi
\fi
% Tens and singles
\@strctr=#1\relax
\@FCmodulo{\@strctr}{100}%
\ifnum\@strctr>0\relax% Trailing zeros are silent
\@@numberunderhundredthswedish{\@strctr}{#2}%
\else
\ifnum#1=0\relax% Unless the number is in fact 0
\eappto#2{\@unitthstring{\@strctr}}%
\fi
\fi
}%
\global\let\@@ordinalstringswedish\@@ordinalstringswedish
\newcommand*{\@ordinalstringMswedish}[2]{%
\let\@unitthstring\@@unitthstringMswedish
\let\@teenthstring\@@teenthstringswedish
\let\@tenthstring\@@tenthstringswedish
\let\@unitstring\@@unitstringMswedish
\let\@teenstring\@@teenstringswedish
\let\@tenstring\@@tenstringswedish
\@@ordinalstringswedish{#1}{#2}%
}%
\global\let\@ordinalstringMswedish\@ordinalstringMswedish
\newcommand*{\@ordinalstringFswedish}[2]{%
\let\@unitthstring\@@unitthstringFswedish
\let\@teenthstring\@@teenthstringswedish
\let\@tenthstring\@@tenthstringswedish
\let\@unitstring\@@unitstringMswedish
\let\@teenstring\@@teenstringswedish
\let\@tenstring\@@tenstringswedish
\@@ordinalstringswedish{#1}{#2}%
}%
\global\let\@ordinalstringFswedish\@ordinalstringFswedish
\global\let\@ordinalstringNswedish\@ordinalstringFswedish
\newcommand*{\@OrdinalstringMswedish}[2]{%
\@ordinalstringMswedish{#1}{\@@num@str}%
\edef#2{\MakeTitlecase{\@@num@str}}%
}%
\global\let\@OrdinalstringMswedish\@OrdinalstringMswedish
\newcommand*{\@OrdinalstringFswedish}[2]{%
\@ordinalstringFswedish{#1}{\@@num@str}%
\edef#2{\MakeTitlecase{\@@num@str}}%
}%
\global\let\@OrdinalstringFswedish\@OrdinalstringFswedish
\newcommand*{\@OrdinalstringNswedish}[2]{%
\@ordinalstringNswedish{#1}{\@@num@str}%
\edef#2{\MakeTitlecase{\@@num@str}}%
}%
\global\let\@OrdinalstringNswedish\@OrdinalstringNswedish
% SET DEFAULTS (begin)
% This section (together with LANGUAGE OPTIONS section at the top) must be commented out if the setup for Swedish language options is not done in `fmtcount.sty` or the .tex document
\newcommand*\fc@swedishoptions@setdefaults{%
\fc@gl@let\fc@swedishoptions@thousands@after\@empty%
\fc@gl@let\fc@swedishoptions@thousands@before\@empty%
\fc@gl@def\fc@swedishoptions@one{neither}%
}%
\global\let\fc@swedishoptions@setdefaults\fc@swedishoptions@setdefaults
{%
\let\fc@gl@def\gdef
\def\fc@gl@let{\global\let}%
\fc@swedishoptions@setdefaults
}%
% SET DEFAULTS (end)
\iffalse Local variables: \fi
\iffalse mode: docTeX \fi
\iffalse End: \fi
\endinput
This is my attempt at an
fc-swedish.def
. I started with a Python script (at the bottom), which I then converted to LaTeX code that draws heavily onfc-german.def
. From my tests it works for numbers 0-99,999 for all genders and for\FCordinal
,ordinalnumber
,\Ordinalnumber
,\ORDINALnumber
,\numberstring
,\Numberstring
, and\NUMBERstring
.My primary concern is that the feminine is default when forming ordinal numbers. Is there some way to change this just for swedish?
Other than that, would you need anything more from me to implement this in the package?
fc-swedish.def