%% \CharacterTable %% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z %% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z %% Digits \0\1\2\3\4\5\6\7\8\9 %% Exclamation \! Double quote \" Hash (number) \# %% Dollar \$ Percent \% Ampersand \& %% Acute accent \' Left paren \( Right paren \) %% Asterisk \* Plus \+ Comma \, %% Minus \- Point \. Solidus \/ %% Colon \: Semicolon \; Less than \< %% Equals \= Greater than \> Question mark \? %% Commercial at \@ Left bracket \[ Backslash \\ %% Right bracket \] Circumflex \^ Underscore \_ %% Grave accent \` Left brace \{ Vertical bar \| %% Right brace \} Tilde \~} %% %\iffalse % % (c) Copyright 2007-2024 Apostolos Syropoulos % This program can be redistributed and/or modified under the % terms of the LaTeX Project Public License Distributed from % http://www.latex-project.org/lppl.txt; either % version 1.3c of the License, or any later version. % % This work has the LPPL maintenance status `maintained'. % % Please report errors or suggestions for improvement to % % Apostolos Syropoulos (asyropoulos@yahoo.com) % %\fi % \CheckSum{802} % \iffalse This is a Metacommentxel % %\ProvidesFile{xgreek.sty} %\ProvidesFile{xelistings} % % [2024/01/30 v3.4.0 Package `xgreek.sty'] % [2022/09/04 v1.0 Package `xelistings.sty'] % % \begin{macrocode} %<*driver> \documentclass{ltxdoc} \GetFileInfo{xgreek.drv} \usepackage{xltxtra} \usepackage{fullpage} \begin{document} %\newopentypefeature{Contextuals}{Alts}{+calt} \setmainfont[Mapping=tex-text,Script=Greek, SmallCapsFeatures={Contextuals=Alternate}]{Universal Modern} \setmonofont{UM Typewriter} \setsansfont[Mapping=tex-text]{GFS Neohellenic} \DocInput{xgreek.dtx} \end{document} % % \end{macrocode} % \fi %\StopEventually{} %\title{Greek Language Support for\\ \XeLaTeX\ and Lua\LaTeX} %\author{Apostolos Syropoulos\\ % Xanthi, Greece\\ % \texttt{asyropoulos@yahoo.com}} % \date{2009/11/23\\ Last Updated 2024/01/30} %\maketitle % \begin{abstract} % The \textsf{xgreek} package provides rudimentary support for Greek language % typesetting with \XeLaTeX and Lua\LaTeX. In particular, it provides support for modern % Greek (either monotonic or polytonic) and ancient Greek. %\end{abstract} % %\section{Introduction} % % The \textsf{xgreek} package provides rudimentary support for Greek language % typesetting with \XeLaTeX and Lua\LaTeX. Users will be able to typeset documents in % either modern Greek (monotonic or polytonic) or ancient Greek by selecting the appropriate % package option. The default ``language'' is monotonic Greek. % % Support for Lua\LaTeX\ was provided by Javier Bezos. % % \section{The Source Code of \textsf{xgreek}} % According to the Unicode standard %\begin{center} %|http://www.unicode.org/Public/UNIDATA/UnicodeData.txt| %\end{center} % the uppercase form of the letter GREEK SMALL LETTER EPSILON WITH TONOS is the letter % GREEK CAPITAL LETTER EPSILON WITH TONOS. According to the grammar of the Greek % language this is wrong. When text is tranfformed into uppercase, all letters lose % accents and when a letter has GREEK DIALYTIKA TONOS, then only the DIALYTIKA remain. % Thus, the uppercase form of the letter GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS is % the letter GREEK CAPITAL LETTER IOTA WITH DIALYTIKA. Also, the uppercase form of the letter % GREEK SMALL LETTER EPSILON WITH TONOS is the letter GREEK CAPITAL LETTER EPSILON. For ancient % Greek something similar holds---All accents and breathings disappear and only the letters having % DIALYTIKA keep them. For example, the uppercase form of the letter GREEK SMALL LETTER % UPSILON WITH DIALYTIKA AND PERISPOMENI is the letter GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA. % In addition, for any lowercase letter that has a GREEK YPOGEGRAMMENI the equivalent uppercase letter % is the one with a PROSGEGRAMMENI. For example, the uppercase form of the letter GREEK SMALL LETTER ETA % WITH OXIA AND YPOGEGRAMMENI is the letter GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI. However, there is % one exception: the word GREEK SMALL LETTER ETA WITH PSILI AND OXIA (GREEK SMALL LETTER ETA WITH TONOS % in Modern Greek), which is the equiavalent of the English word ``or.'' In order not to confuse it with % the feminine article in the nominative case (i.e., the letter GREEK SMALL LETTER ETA WITH DASIA), % this article keeps the accent in an uppercase letters only text. Unfortunately, this feature cannot be % easily implemented since it would require a rule of the form %\begin{center} % ``SPACE'' ``GREEK SMALL LETTER ETA WITH PSILI AND OXIA'' ``SPACE''\\ --->\\ ``SPACE'' ``GREEK CAPITAL LETTER ETA WITH OXIA'' ``SPACE'' %\end{center} % % It is a fact that \LaTeX\ {\em blindly} follows the Unicode standard and so the command |\MakeUppercase| produces wrong output. % For this reason, in previous versions of this package, I introduced many pairs of |\uccode| and |\lccode| commands to fix % this problem. Quite recently, I realize that these commands do not produce the expected result as the new implementation of % the command |\MakeUppercase| completely ignores these commands. Fortunately, the person who did this re-implementation, % defined the new command |\DeclareUppercaseMapping| which maps the character code of a lowercase letter to the actual % uppercase character. The commands that follow implement the grammatical rules of the Greek language except of course the % rule for the Greek disjunctive conjunction. % \begin{macrocode} %<*xgreek> \message{Package 'xgreek' version 3.4.0 by Apostolos Syropoulos} \DeclareUppercaseMapping{"0390}{Ϊ} \DeclareLowercaseMapping{"0390}{ΐ} \DeclareUppercaseMapping{"03AC}{Α} \DeclareLowercaseMapping{"03AC}{ά} \DeclareUppercaseMapping{"03AD}{Ε} \DeclareLowercaseMapping{"03AD}{έ} \DeclareUppercaseMapping{"03AE}{Η} \DeclareLowercaseMapping{"03AE}{ή} \DeclareUppercaseMapping{"03AF}{Ι} \DeclareLowercaseMapping{"03AF}{ί} \DeclareUppercaseMapping{"03B0}{Ϋ} \DeclareLowercaseMapping{"03B0}{ΰ} \DeclareUppercaseMapping{"03CA}{Ϊ} \DeclareLowercaseMapping{"03CA}{ϊ} \DeclareUppercaseMapping{"03CB}{Ϋ} \DeclareLowercaseMapping{"03CB}{ϋ} \DeclareUppercaseMapping{"03CC}{Ο} \DeclareLowercaseMapping{"03CC}{ό} \DeclareUppercaseMapping{"03CD}{Υ} \DeclareLowercaseMapping{"03CD}{ύ} \DeclareUppercaseMapping{"03CE}{Ω} \DeclareLowercaseMapping{"03CE}{ώ} \DeclareUppercaseMapping{"1F00}{Α} \DeclareUppercaseMapping{"0386}{Α} \DeclareUppercaseMapping{"1F01}{Α} \DeclareUppercaseMapping{"0388}{Ε} \DeclareUppercaseMapping{"1F02}{Α} \DeclareUppercaseMapping{"0389}{Η} \DeclareUppercaseMapping{"1F03}{Α} \DeclareUppercaseMapping{"038A}{Ι} \DeclareUppercaseMapping{"1F04}{Α} \DeclareUppercaseMapping{"038C}{Ο} \DeclareUppercaseMapping{"1F05}{Α} \DeclareUppercaseMapping{"038E}{Υ} \DeclareUppercaseMapping{"1F06}{Α} \DeclareUppercaseMapping{"038F}{Ω} \DeclareUppercaseMapping{"1F07}{Α} \DeclareUppercaseMapping{"1F10}{Ε} \DeclareUppercaseMapping{"1F11}{Ε} \DeclareUppercaseMapping{"1F12}{Ε} \DeclareUppercaseMapping{"1F13}{Ε} \DeclareUppercaseMapping{"1F14}{Ε} \DeclareUppercaseMapping{"1F15}{Ε} \DeclareUppercaseMapping{"1F20}{Η} \DeclareUppercaseMapping{"1F21}{Η} \DeclareUppercaseMapping{"1F22}{Η} \DeclareUppercaseMapping{"1F23}{Η} \DeclareUppercaseMapping{"1F24}{Η} \DeclareUppercaseMapping{"1F25}{Η} \DeclareUppercaseMapping{"1F26}{Η} \DeclareUppercaseMapping{"1F27}{Η} \DeclareUppercaseMapping{"1F30}{Ι} \DeclareUppercaseMapping{"1F31}{Ι} \DeclareUppercaseMapping{"1F32}{Ι} \DeclareUppercaseMapping{"1F33}{Ι} \DeclareUppercaseMapping{"1F34}{Ι} \DeclareUppercaseMapping{"1F35}{Ι} \DeclareUppercaseMapping{"1F36}{Ι} \DeclareUppercaseMapping{"1F37}{Ι} \DeclareUppercaseMapping{"1F40}{Ο} \DeclareUppercaseMapping{"1F41}{Ο} \DeclareUppercaseMapping{"1F42}{Ο} \DeclareUppercaseMapping{"1F43}{Ο} \DeclareUppercaseMapping{"1F44}{Ο} \DeclareUppercaseMapping{"1F45}{Ο} \DeclareUppercaseMapping{"1F50}{Υ} \DeclareUppercaseMapping{"1F51}{Υ} \DeclareUppercaseMapping{"1F52}{Υ} \DeclareUppercaseMapping{"1F53}{Υ} \DeclareUppercaseMapping{"1F54}{Υ} \DeclareUppercaseMapping{"1F55}{Υ} \DeclareUppercaseMapping{"1F56}{Υ} \DeclareUppercaseMapping{"1F57}{Υ} \DeclareUppercaseMapping{"1F60}{Ω} \DeclareUppercaseMapping{"1F61}{Ω} \DeclareUppercaseMapping{"1F62}{Ω} \DeclareUppercaseMapping{"1F63}{Ω} \DeclareUppercaseMapping{"1F64}{Ω} \DeclareUppercaseMapping{"1F65}{Ω} \DeclareUppercaseMapping{"1F66}{Ω} \DeclareUppercaseMapping{"1F67}{Ω} \DeclareUppercaseMapping{"1F70}{Α} \DeclareUppercaseMapping{"1F71}{Α} \DeclareUppercaseMapping{"1F72}{Ε} \DeclareUppercaseMapping{"1F73}{Ε} \DeclareUppercaseMapping{"1F74}{Η} \DeclareUppercaseMapping{"1F75}{Η} \DeclareUppercaseMapping{"1F76}{Ι} \DeclareUppercaseMapping{"1F77}{Ι} \DeclareUppercaseMapping{"1F78}{Ο} \DeclareUppercaseMapping{"1F79}{Ο} \DeclareUppercaseMapping{"1F7A}{Υ} \DeclareUppercaseMapping{"1F7B}{Υ} \DeclareUppercaseMapping{"1F7C}{Ω} \DeclareUppercaseMapping{"1F7D}{Ω} \DeclareUppercaseMapping{"1F80}{ᾼ} \DeclareUppercaseMapping{"1F81}{ᾼ} \DeclareUppercaseMapping{"1F82}{ᾼ} \DeclareUppercaseMapping{"1F83}{ᾼ} \DeclareUppercaseMapping{"1F84}{ᾼ} \DeclareUppercaseMapping{"1F85}{ᾼ} \DeclareUppercaseMapping{"1F86}{ᾼ} \DeclareUppercaseMapping{"1F87}{ᾼ} \DeclareUppercaseMapping{"1F90}{ῌ} \DeclareUppercaseMapping{"1F91}{ῌ} \DeclareUppercaseMapping{"1F92}{ῌ} \DeclareUppercaseMapping{"1F93}{ῌ} \DeclareUppercaseMapping{"1F94}{ῌ} \DeclareUppercaseMapping{"1F95}{ῌ} \DeclareUppercaseMapping{"1F96}{ῌ} \DeclareUppercaseMapping{"1F97}{ῌ} \DeclareUppercaseMapping{"1FA0}{ῼ} \DeclareUppercaseMapping{"1FA1}{ῼ} \DeclareUppercaseMapping{"1FA2}{ῼ} \DeclareUppercaseMapping{"1FA3}{ῼ} \DeclareUppercaseMapping{"1FA4}{ῼ} \DeclareUppercaseMapping{"1FA5}{ῼ} \DeclareUppercaseMapping{"1FA6}{ῼ} \DeclareUppercaseMapping{"1FA7}{ῼ} \DeclareUppercaseMapping{"1FB2}{ᾼ} \DeclareUppercaseMapping{"1FB3}{ᾼ} \DeclareUppercaseMapping{"1FB4}{ᾼ} \DeclareUppercaseMapping{"1FB6}{Α} \DeclareUppercaseMapping{"1FB7}{ᾼ} \DeclareUppercaseMapping{"1FC2}{ῌ} \DeclareUppercaseMapping{"1FC3}{ῌ} \DeclareUppercaseMapping{"1FC4}{ῌ} \DeclareUppercaseMapping{"1FC6}{Η} \DeclareUppercaseMapping{"1FC7}{ῌ} \DeclareUppercaseMapping{"1FD2}{Ϊ} \DeclareUppercaseMapping{"1FD3}{Ϊ} \DeclareUppercaseMapping{"1FD6}{Ι} \DeclareUppercaseMapping{"1FD7}{Ϊ} \DeclareUppercaseMapping{"1FE2}{Ϋ} \DeclareUppercaseMapping{"1FE3}{Ϋ} \DeclareUppercaseMapping{"1FE4}{Ρ} \DeclareUppercaseMapping{"1FE5}{Ρ} \DeclareUppercaseMapping{"1FE6}{Υ} \DeclareUppercaseMapping{"1FE7}{Ϋ} \DeclareUppercaseMapping{"1FF2}{ῼ} \DeclareUppercaseMapping{"1FF3}{ῼ} \DeclareUppercaseMapping{"1FF4}{ῼ} \DeclareUppercaseMapping{"1FF6}{Ω} \DeclareUppercaseMapping{"1FF7}{ῼ} % \end{macrocode} % Next I define the various strings that correspond to the standard \LaTeX\ captions. % I first define the strings for monotonic Greek. % \begin{macrocode} \def\prefacename{Πρόλογος}% \def\refname{Αναφορές}% \def\abstractname{Περίληψη}% \def\bibname{Βιβλιογραφία}% \def\chaptername{Κεφάλαιο}% \def\appendixname{Παράρτημα}% \def\contentsname{Περιεχόμενα}% \def\listfigurename{Κατάλογος σχημάτων}% \def\listtablename{Κατάλογος πινάκων}% \def\indexname{Ευρετήριο}% \def\figurename{Σχήμα}% \def\tablename{Πίνακας}% \def\partname{Μέρος}% \def\enclname{Συνημμένα}% \def\ccname{Κοινοποίηση}% \def\headtoname{Προς}% \def\pagename{Σελίδα}% \def\seename{βλέπε}% \def\alsoname{βλέπε επίσης}% \def\proofname{Απόδειξη}% \def\glossaryname{Γλωσσάρι}% % \end{macrocode} % Macro |\polytonicn@mes| is invoked when polytonic Greek is the main language of the document. % \begin{macrocode} \def\polytonicn@mes{% \def\refname{Ἀναφορὲς}% \def\indexname{Εὑρετήριο}% \def\figurename{Σχῆμα}% \def\headtoname{Πρὸς}% \def\alsoname{βλέπε ἐπίσης}% \def\proofname{Ἀπόδειξη}% } % \end{macrocode} % Macro |\@ncientn@mes| is invoked when ancient Greek is the main language of the document (Dinitrios Filippou % spotted a couple of spelling errors in the list below). % \begin{macrocode} \def\@ncientn@mes{% \def\prefacename{Προοίμιον}% \def\abstractname{Περίληψις}% \def\bibname{Βιβλιογραφία}% \def\chaptername{Κεφάλαιον}% \def\appendixname{Παράρτημα}% \def\contentsname{Περιεχόμενα}% \def\listfigurename{Κατάλογος σχημάτων}% \def\listtablename{Κατάλογος πινάκων}% \def\indexname{Εὑρετήριον}% \def\tablename{Πίναξ}% \def\partname{Μέρος}% \def\enclname{Συνημμένως}% \def\ccname{Κοινοποίησις}% \def\headtoname{Πρὸς}% \def\pagename{Σελὶς}% \def\seename{ὅρα}% \def\alsoname{ὅρα ὡσαύτως}% \def\proofname{Ἀπόδειξις}% \def\glossaryname{Γλωσσάριον}% \def\refname{Ἀναφοραὶ}% \def\figurename{Σχῆμα}% \def\headtoname{Πρὸς}% } % \end{macrocode} % I redefine |\today| so as to produce dates in Greek. The % names of months are defined by the macro |\gr@month|. % \begin{macrocode} \def\gr@month{% \ifcase\month\or Ιανουαρίου\or Φεβρουαρίου\or Μαρτίου\or Απριλίου\or Μαΐου\or Ιουνίου\or Ιουλίου\or Αυγούστου\or Σεπτεμβρίου\or Οκτωβρίου\or Νοεμβρίου\or Δεκεμβρίου\fi} \def\today{\number\day \space \gr@month\space \number\year} % \end{macrocode} % When either polytonic Greek or ancient Greek is the main language of the document, % then the macro |\gr@c@month| becomes active. % \begin{macrocode} \def\gr@c@month{% \ifcase\month\or Ἰανουαρίου\or Φεβρουαρίου\or Μαρτίου\or Ἀπριλίου\or Μαΐου\or Ἰουνίου\or Ἰουλίου\or Αὐγούστου\or Σεπτεμβρίου\or Ὀκτωβρίου\or Νοεμβρίου\or Δεκεμβρίου\fi} % \end{macrocode} % Next, I define a few macros that allow one to access characters % that are not usually easily accessible from the keyboard (e.g., the sampi or the % koppa symbol). The list includes a command for the Unicode symbol GREEK ANO TELEIA, % which, in some systems, is confused with MIDDLE DOT. The use of command |\numer@lsign| % will be explained later. % \begin{macrocode} \def\anwtonos{ʹ} %GREEK NUMERAl SIGN \let\numer@lsign\anwtonos \def\katwtonos{͵} %GREEK LOWER NUMERAL SIGN \def\koppa{\char"03DF\relax} \def\sampi{\char"03E1\relax} \def\Digamma{\char"03DC\relax} \def\ddigamma{\char"03DD\relax} \def\anoteleia{\char"0387\relax} \def\euro{\char"20AC\relax} \def\permill{\char"2030\relax} % \end{macrocode} % Many users prefer the use of the letters sigma and tau instead of the stigma symbol in % Greek numerals, therefore, by default the |\stigma| command expands to ``στ''. % \begin{macrocode} \def\stigma{στ\relax} % \end{macrocode} % The following commands take care of the basic rules of typography. Note that the first command % changes the way space is added after punctuation symbols and the last two commands force \LaTeX\ % to add indentation space to the first paragraph after a header. Since a number of users need, for % their own reasons, to be able to disable this particular feature I have introduced a new package % option, namely |noindentfirst|, which restores the default behavior. In order to be able % to do this I need the original value of the boolean variable |\@afterindentfalse|. % \begin{macrocode} \frenchspacing \let\@saveafterindentfalse\@afterindentfalse \let\@afterindentfalse\@afterindenttrue \@afterindenttrue % \end{macrocode} % Lua\LaTeX\ and \XeLaTeX\ have different ways to load hyphenation patterns. Package % \textsf{luahyphenrules} by Javier Bezos facilitates this process for people who % want to use Lua\LaTeX\ and the ``traditional'' way to load hyphenation patterns. % To ensure proper inclusion of LuaTeX staff, I use the following ``idiom'': % \begin{center} % |\ifx\directlua\undefined |\texttt{\textit{non Lua\LaTeX\ code}}|\else |% % \texttt{\textit{Lua\LaTeX\ code}}|\fi| % \end{center} % \begin{macrocode} \ifx\directlua\undefined\else\RequirePackage{luahyphenrules}\fi % \end{macrocode} % The code that follows specifies which hyphenation patterns will be active. The \XeLaTeX\ code % is quite standard and depends on the \textsf{babel} pattern loading mechanism, while the % Lua\LaTeX\ code uses the |\HyphenRules| macro, which has essentially the functionality % of the |\selectlanguage| macro. % \begin{macrocode} \DeclareOption{monogreek}{% \ifx\directlua\undefined% \language\l@monogreek\else\HyphenRules{monogreek}\fi% } \DeclareOption{polygreek}{% \ifx\directlua\undefined% \language\l@polygreek\else\HyphenRules{polygreek}\fi% \polytonicn@mes% \let\gr@month\gr@c@month% } \DeclareOption{ancientgreek}{% \ifx\directlua\undefined% \language\l@ancientgreek\else\HyphenRules{ancientgreek}\fi% \@ncientn@mes% \let\gr@month\gr@c@month% } % \end{macrocode} % If a user wants to use the stigma symbol in Greek numerals, she should use the % |stigma| option. % \begin{macrocode} \DeclareOption{stigma}{% \def\stigma{\char"03DB\relax} } % \end{macrocode} % As noted above, the new option |noindentfirst| restores the default \LaTeX\ behavior of adding no % indentation to the first paragraph after any header. % \begin{macrocode} \DeclareOption{noindentfirst}{% \let\@afterindentfalse\@saveafterindentfalse } % \end{macrocode} % Nowadays it is customary in Greece to use Greek numerals without the GREEK NUMERAL SIGN at the end % of a numeral. Thus, the |nonumeralsign| option disables the typesetting of the GREEK NUMERAL SIGN % at the end of Greek numerals. % \begin{macrocode} \DeclareOption{nonumeralsign}{% \let\numer@lsign\relax } % \end{macrocode} % Package \textsf{listings} does not work properly with UTF-8 encoded files. So this % option should be used whenever one wants to use this package and see Greek text come out % correctly. In version 3.1.0 of this package, I included code that modified the source code of % package \textsf{listings}. However, this decision was wrong. In particular, when one did not use % the corresponding \texttt{listings} option, processing of the input file stopped with an error message % about a text line that contains an invalid character. So the best way to solve this problem was to move % the code to a different file and create essentially a new package. This package is automatically loaded % when the user pecifies the \texttt{listings} option. To make this possible, I used a boolean % variable. % \begin{macrocode} \newif\if@mylistings \@mylistingsfalse \DeclareOption{listings}{\@mylistingstrue} % \end{macrocode} % By default the |monogreek| option is activated. % \begin{macrocode} \ExecuteOptions{monogreek} \ProcessOptions % \end{macrocode} % If the user has enabled the |listings| option, then the package loads the package \textsf{xelistings}. % \begin{macrocode} \if@mylistings \RequirePackage{xelistings} \fi % \end{macrocode} % Now I am going to define the macros that typeset alphabetic Greek numerals. The code % is borrowed from the Greek option for the babel package. % \begin{macro}{\gr@ill@value} % When the argument of |\greeknumeral| has a value outside of the % acceptable bounds ($0 < x < 999999$) a warning will be issued % (and nothing will be printed). % \begin{macrocode} \def\gr@ill@value#1{% \PackageWarning{xgreek}{Illegal value (#1) for greeknumeral}} % \end{macrocode} % \end{macro} % \begin{macro}{\anw@true} % \begin{macro}{\anw@false} % \begin{macro}{\anw@print} % When a large number with three \emph{trailing} zeros is to be % printed those zeros \emph{and} the numeric mark need to be % discarded. As each `digit' is processed by a separate macro % \emph{and} because the processing needs to be expandable we need % some helper macros that help remember to \emph{not} print the % numeric mark (|\numer@lsign|). % % The command |\anw@false| switches the printing of the numeric % mark off by making |\anw@print| expand to nothing. The command % |\anw@true| (re)enables the printing of the numeric marc. These % macro's need to be robust in order to prevent improper expansion % during writing to files or during |\uppercase|. % \begin{macrocode} \DeclareRobustCommand\anw@false{% \DeclareRobustCommand\anw@print{}} \DeclareRobustCommand\anw@true{% \DeclareRobustCommand\anw@print{\numer@lsign}} \anw@true % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\@greeknumeral} % This command is used to get Greek numerals. The command uses % |\numer@lsign| to get the NUMERAL SIGN. Obviously, when the % user has specified the \texttt{no\-numeral\-sign} option, then numeral % comes out without the trailing NUMERAL SIGN. However, when a user % wants to typeset a Greek numeral, the numeral must come out correctly, % regardless of what appears in headers, etc. And that is exactly the % reason why this command is inaccessible to users. % The command |\@greeknumeral| needs to be \emph{fully} expandable % in order to get the right information in auxiliary % files. Therefore we use a big |\if|-construction to check the % value of the argument and start the parsing at the right level. % \begin{macrocode} \def\@greeknumeral#1{% % \end{macrocode} % If the value is negative or zero nothing is printed and a warning % is issued. % \begin{macrocode} \ifnum#1<\@ne\space\gr@ill@value{#1}% \else \ifnum#1<10\expandafter\gr@num@i\number#1% \else \ifnum#1<100\expandafter\gr@num@ii\number#1% \else % \end{macrocode} % The available shorthands for 1.000 (|\@m|) and 10.000 % (|\@M|) are used to save a few tokens. % \begin{macrocode} \ifnum#1<\@m\expandafter\gr@num@iii\number#1% \else \ifnum#1<\@M\expandafter\gr@num@iv\number#1% \else \ifnum#1<100000\expandafter\gr@num@v\number#1% \else \ifnum#1<1000000\expandafter\gr@num@vi\number#1% \else % \end{macrocode} % If the value is too large, nothing is printed and a warning % is issued. % \begin{macrocode} \space\gr@ill@value{#1}% \fi \fi \fi \fi \fi \fi \fi } % \end{macrocode} % \end{macro} % % What is left to make complete the definition of command |\greeknumeral| is a set of macros to produce % the various digits. % \begin{macro}{\gr@num@i} % \begin{macro}{\gr@num@ii} % \begin{macro}{\gr@num@iii} % As there is no ``digit'' representing $0$ in this system, the zeros % are simply discarded. When there is a large number with three % \emph{trailing} zeros also the numeric mark is discarded. % Therefore these macros need to pass the information to each other % about the (non-)translation of a zero. % \begin{macrocode} \def\gr@num@i#1{% \ifcase#1\or α\or β\or γ\or δ\or ε\or \stigma\or ζ\or η\or θ\fi \ifnum#1=\z@\else\anw@true\fi\anw@print} \def\gr@num@ii#1{% \ifcase#1\or ι\or κ\or λ\or μ\or ν\or ξ\or ο\or π\or \koppa\fi \ifnum#1=\z@\else\anw@true\fi\gr@num@i} \def\gr@num@iii#1{% \ifcase#1\or ρ\or σ\or τ\or υ\or φ\or χ\or ψ\or ω\or \sampi\fi \ifnum#1=\z@\anw@false\else\anw@true\fi\gr@num@ii} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\gr@num@iv} % \begin{macro}{\gr@num@v} % \begin{macro}{\gr@num@vi} % The first three ``digits'' always have the numeric mark, except % when one is discarded because it's value is zero. % \begin{macrocode} \def\gr@num@iv#1{% \ifnum#1=\z@\else\katwtonos\fi \ifcase#1\or α\or β\or γ\or δ\or ε\or \stigma\or ζ\or η\or θ\fi \gr@num@iii} \def\gr@num@v#1{% \ifnum#1=\z@\else\katwtonos\fi \ifcase#1\or ι\or κ\or λ\or μ\or ν\or ξ\or ο\or π\or \koppa\fi \gr@num@iv} \def\gr@num@vi#1{% \katwtonos \ifcase#1\or ρ\or σ\or τ\or υ\or φ\or χ\or ψ\or ω\or \sampi\fi \gr@num@v} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \begin{macro}{\@Greeknumeral} % The command |\@Greeknumeral| prints uppercase Greek numerals. % The parsing is performed by the macro |\@greeknumeral|. The printing % of the NUMERAL SIGN depends on the value of |\numer@lsign|. % \begin{macrocode} \def\@Greeknumeral#1{% \expandafter\MakeUppercase\expandafter{\@greeknumeral{#1}}} % \end{macrocode} % \end{macro} % \begin{macro}{\greeknumeral} % This command prints lowercase Greek numerals and the NUMERAL SIGN % is always printed. % \begin{macrocode} \def\greeknumeral#1{% \let\@numer@lsign\numer@lsign% \let\numer@lsign\anwtonos% \@greeknumeral{#1} \let\numer@lsign\@numer@lsign} % \end{macrocode} % \end{macro} % \begin{macro}{\Greeknumeral} % This command prints uppercase Greek numerals and the NUMERAL SIGN % is always printed. % \begin{macrocode} \def\Greeknumeral#1{% \let\@numer@lsign\numer@lsign% \let\numer@lsign\anwtonos% \@Greeknumeral{#1} \let\numer@lsign\@numer@lsign} % \end{macrocode} % \end{macro} % % The alphabetic numbering system is not the only numbering system employed by Greeks. % In fact, Greeks used various systems that are now known as {\em acrophonic} numbering % systems. Many scholars are familiar with the acrophonic Attic numbering system and the % the command |\atticnum| can be used to generate acrophonic Attic numerals. % The acrophonic Attic numbering system, like the Roman one, employs % letters to denote important numbers. Multiple occurrence of a letter denote % a multiple of the ``important'' number, e.g., the letter Ι denotes 1, so % ΙΙΙ denotes 3. Here are the basic digits used in the acrophonic Attic numbering % system: % \begin{itemize} % \item Ι denotes the number one (1) % \item Π denotes the number five (5) % \item Δ denotes the number ten (10) % \item Η denotes the number one hundred (100) % \item Χ denotes the number one thousand (1000) % \item Μ denotes the number ten thousands (10000) %\end{itemize} % Moreover, the letters Δ, Η, Χ, and Μ under the letter ^^^^^^010143 (a form of Π) % denote five times their original value. In particular, the symbol ^^^^^10144, denotes % the number 50, the symbol ^^^^^10145 denotes the number 500, the symbol ^^^^^10146 % denotes the number 5000, and the symbol ^^^^^10147 denotes the number 50,000. It % must be noted that the numbering system does not provide negative numerals or a symbol for % zero. %\begin{macro}{\@@atticnum} % Now, let me definite the macro % |\@@atticnum|. This macro uses one integer variable (or counter in % \TeX's jargon.) % \begin{macrocode} \newcount\@attic@num % \end{macrocode} % The macro |\@@atticnum| is also defined as a robust command. % \begin{macrocode} \DeclareRobustCommand*{\@@atticnum}[1]{% % \end{macrocode} % After assigning to variable |\@attic@num| the value of the macro's argument, % we make sure that the argument is in the expected range, i.e., it is greater % than zero, and less or equal to $249999$. In case it is not, it simply % produces a |\space|, warns the user about it and quits. Although, the % |\atticnum| macro is capable to produce an Athenian numeral for even greater % intergers, the following argument by Claudio Beccari convinced me to place % this upper limit: % \begin{quote} % According to psychological perception studies (that ancient Athenians % and Romans perfectly knew without needing to study Freud and Jung) % living beings (which includes at least all vertebrates, not only % humans) can perceive up to four randomly set objects of the same kind % without the need of counting, the latter activity being a specific % acquired ability of human kind; the biquinary numbering notation % used by the Athenians and the Romans exploits this natural % characteristic of human beings. % \end{quote} % \begin{macrocode} \@attic@num#1\relax \ifnum\@attic@num<\@ne% \space% \PackageWarning{xgreek}{% Illegal value (\the\@attic@num) for acrophonic Attic numeral}% \else\ifnum\@attic@num>249999% \space% \PackageWarning{xgreek}{% Value too large (\the\@attic@num) for acrophonic Attic numeral}% \else % \end{macrocode} % Having done all the necessary checks, it is possible to proceed with the actual % computation. If the number is greater than $49999$, then it certainly % has at least one ^^^^^10147 ``digit''. The macro finds all such digits by continuously % subtracting $50000$ from |\@attic@num|, until |\@attic@num| becomes less than % $50000$. % \begin{macrocode} \@whilenum\@attic@num>49999\do{% ^^^^^^010147\advance\@attic@num-50000}% % \end{macrocode} % Next the macro checks for tens of thousands. % \begin{macrocode} \@whilenum\@attic@num>9999\do{% M\advance\@attic@num-\@M}% % \end{macrocode} % Since a number can have only one ^^^^^10146 ``digit'' (equivalent to 5000), it % is easy to check whether is should have one and produce the corresponding numeral when % it does have one. % \begin{macrocode} \ifnum\@attic@num>4999% ^^^^^^010146\advance\@attic@num-5000% \fi\relax % \end{macrocode} % The macro should also check for thousands, the same way it checked for tens of thousands. % \begin{macrocode} \@whilenum\@attic@num>999\do{% Χ\advance\@attic@num-\@m}% % \end{macrocode} % Since a numeral can have at most one ^^^^^10145 ``digit'' (equivalent to 500), this should be % handled the way the macro handled the case of the five thousands ``digit''. % \begin{macrocode} \ifnum\@attic@num>499% ^^^^^^010145\advance\@attic@num-500% \fi\relax % \end{macrocode} % It is time to check hundreds, which follow the same pattern as thousands. % \begin{macrocode} \@whilenum\@attic@num>99\do{% Η\advance\@attic@num-100}% % \end{macrocode} % A numeral can have only one ^^^^^10144 ``digit'' (equivalent to 50). % \begin{macrocode} \ifnum\@attic@num>49% ^^^^^^010144\advance\@attic@num-50% \fi\relax % \end{macrocode} % The macro now checks now for tens digit. % \begin{macrocode} \@whilenum\@attic@num>9\do{% Δ\advance\@attic@num by-10}% % \end{macrocode} % Finally, it has to check for fives and the digits 1, 2, 3, and 4. % \begin{macrocode} \@whilenum\@attic@num>4\do{% Π\advance\@attic@num-5}% \ifcase\@attic@num\or Ι\or ΙΙ\or ΙΙΙ\or ΙΙΙΙ\fi% \fi\fi} % \end{macrocode} %\end{macro} % %\begin{macro}{\@atticnum} % The command |\@atticnum| has one argument, which % is a counter. It calls the command |\@@atticnum| to process the value of % the counter. % \begin{macrocode} \def\@atticnum#1{% \expandafter\@@atticnum\expandafter{\the#1}} % \end{macrocode} %\end{macro} %\begin{macro}{\atticnum} % The command |\atticnum| is a wrapper that declares % a new counter in a local scope, assigns to it the value of the argument of the command % and calls the macro |\@atticnum|. This way the command can process correctly % either a number or a counter. % \begin{macrocode} \def\atticnum#1{% \@attic@num#1\relax \@atticnum{\@attic@num}} % \end{macrocode} %\end{macro} % % \begin{macro}{\greek@alph} % \begin{macro}{\greek@Alph} % Here I redefine the macros |\@alph| and |\@Alph|. First, I define some placeholders % \begin{macrocode} \let\latin@alph\@alph \let\latin@Alph\@Alph % \end{macrocode} % Then I define the Greek versions; the additional |\expandafter|s % are needed in order to make sure the table of contents will be % correct (e.g., when there are appendices). % \begin{macrocode} \def\greek@alph#1{\expandafter\@greeknumeral\expandafter{\the#1}} \def\greek@Alph#1{\expandafter\@Greeknumeral\expandafter{\the#1}} % \end{macrocode} % By default, Greek alphabetic numerals instead of Latin numerals are used to enumerate items in an % enumeration environment. % \begin{macrocode} \let\@alph\greek@alph \let\@Alph\greek@Alph % \end{macrocode} % If for some reason, one needs to have the Latin numerals back, then she has to invoke command % |\nogreekalph|. And if she wants to switch back, then she has to use the |\greekalph| % command: % \begin{macrocode} \def\nogreekalph{% \let\@alph\latin@alph \let\@Alph\latin@Alph} \def\greekalph{% \let\@alph\greek@alph \let\@Alph\greek@Alph} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\setlanguage} % We provide the |\setlanguage| command which % activates the hypehnation patterns of some other language. It is similar % to babel's |\selectlanguage|, but we opted to use a new name to avoid possible name conflicts. % Valid arguments include |monogreek|, |polygreek|, |ancientgreek|, and |american|. As was noted % previously, package \textsf{luahyphenrules} provides the command |\HyphenRules| which has exactly % the same functionality as this command. So when using Lua\LaTeX\ users will actually use the % |\HyphenRules| command. % \begin{macrocode} \ifx\directlua\undefined% \def\setlanguage#1{% \expandafter\ifx\csname l@#1\endcsname\relax% \typeout{^^J Error: No hyphenation pattern for}% \typeout{ language #1 are loaded,}% \typeout{ default hyphenation patterns are used.^^J}% \language=0% \else\language=\csname l@#1\endcsname\fi} \else \let\setlanguage\HyphenRules \fi % \end{macrocode} % \end{macro} % The macros |\grtoday| and |\Grtoday| produces the current date, only that the % month and the day are shown as Greek numerals instead of Arabic % as it is usually the case. In addition, the two commands differ in that the % later produces the Greek numerals in uppercase. % \begin{macrocode} \def\grtoday{% \expandafter\greeknumeral\expandafter{\the\day}\space \gr@c@month\space \expandafter\greeknumeral\expandafter{\the\year}} \def\Grtoday{% \expandafter\Greeknumeral\expandafter{\the\day}\space \gr@c@month\space \expandafter\Greeknumeral\expandafter{\the\year}} % % \end{macrocode} % \section{The Source Code of \textsf{xelistings}} % % If the user has enabled the |listings| option, then the package loads the rudimentary package % \textsf{xelistings}. This package loads the \textsf{listings} package and makes accessible to % it all characters in the range 128--255 plus all Greek letters that belong to the % Greek and Coptic Unicode block. This is achieved by redefining the command |\lst@DefEC|. % \begin{macrocode} %<*xelistings> \RequirePackage{listings} \lstset{inputencoding=utf8} \lst@InputCatcodes \gdef\lst@DefEC{% \lst@CCECUse \lst@ProcessLetter ^^80^^81^^82^^83^^84^^85^^86^^87^^88^^89^^8a^^8b^^8c^^8d^^8e^^8f% ^^90^^91^^92^^93^^94^^95^^96^^97^^98^^99^^9a^^9b^^9c^^9d^^9e^^9f% ^^a0^^a1^^a2^^a3^^a4^^a5^^a6^^a7^^a8^^a9^^aa^^ab^^ac^^ad^^ae^^af% ^^b0^^b1^^b2^^b3^^b4^^b5^^b6^^b7^^b8^^b9^^ba^^bb^^bc^^bd^^be^^bf% ^^c0^^c1^^c2^^c3^^c4^^c5^^c6^^c7^^c8^^c9^^ca^^cb^^cc^^cd^^ce^^cf% ^^d0^^d1^^d2^^d3^^d4^^d5^^d6^^d7^^d8^^d9^^da^^db^^dc^^dd^^de^^df% ^^e0^^e1^^e2^^e3^^e4^^e5^^e6^^e7^^e8^^e9^^ea^^eb^^ec^^ed^^ee^^ef% ^^f0^^f1^^f2^^f3^^f4^^f5^^f6^^f7^^f8^^f9^^fa^^fb^^fc^^fd^^fe^^ff% ^^^^0396^^^^0388^^^^0389^^^^038a^^^^038c% <--- Begin of Greek Letters ^^^^038e^^^^038f^^^^0390^^^^0391^^^^0392% ^^^^0393^^^^0394^^^^0395^^^^0396^^^^0397% ^^^^0398^^^^0399^^^^039a^^^^039b^^^^039c% ^^^^039d^^^^039e^^^^039f^^^^03a0^^^^03a1% ^^^^03a3^^^^03a4^^^^03a5^^^^03a6^^^^03a7% ^^^^03a8^^^^03a9^^^^03aa^^^^03ab^^^^03ac% ^^^^03ad^^^^03ae^^^^03af^^^^03b0^^^^03b1% ^^^^03b2^^^^03b3^^^^03b4^^^^03b5^^^^03b6% ^^^^03b7^^^^03b8^^^^03b9^^^^03ba^^^^03bb% ^^^^03bc^^^^03bd^^^^03be^^^^03bf^^^^03c0% ^^^^03c1^^^^03c2^^^^03c3^^^^03c4^^^^03c5% ^^^^03c6^^^^03c7^^^^03c8^^^^03c9^^^^03ca% ^^^^03cb^^^^03cc^^^^03cd^^^^03ce% <--- End of Greek Letters ^^00}% \lst@RestoreCatcodes % % \end{macrocode} % \Finale