% \iffalse meta-comment
% !TEX program  = lualatex
%<*internal>
\iffalse
%</internal>
%<*readme>
----------------------------------------------------------------

Ukrainian language module for Babel, v1.5a

Released under the LaTeX Project Public License v1.3c or later.
See http://www.latex-project.org/lppl.txt

The package provides support for use of Babel in documents written in Ukrainian. The support is adapted for use both
under legacy TEX engines, and under X∃TEX and LuaTEX.

Based on Russian language module v1.3i by Igor A. Kotelnikov <kia999 at mail dot ru>.

The current maintainer is Sergiy Ponomarenko <sergiy.ponomarenko@gmail.com>.


1. INSTALLATION

- unpack babel-ukrainian.zip
- run "lualatex.exe ukraineb.dtx" (recommended)
  or "pdflatex.exe ukraineb.dtx";
  run "tex.exe ukraineb.dtx"
  or "tex.exe ukraineb.ins", if you don't need documentation
- move "ukraineb.ldf" to <textmf>/tex/generic/babel/babel-ukrainian/
- move "ukraineb.pdf" and README to <textmf>/doc/generic/babel-ukrainian/
- update filename base (see documentation for your TeX system)


2. USAGE

Ukrainian language definition file can be used both with legacy 8-bit engines
(such as latex.exe or pdflatex.exe) and Unicode compilers (xelatex.exe or
lualatex.exe). The Unicode engines can be ran either in Unicode mode or 8-bit
compatibility mode, which emulates the legacy engines. The two modes differ by
a set of packages loaded in the preamble of a source TeX file. It is important
to keep recommended order of the packages loaded, especially when running
Unicode engines in a compatibility 8-bit mode.

In the examples below, it is assumed that a source file has utf8 input encoding.

2.1. 8-bit mode

2.1.1 PDFLATeX, LaTeX

    \usepackage[T1,T2A]{fontenc}
    \usepackage[utf8]{inputenc}
    \usepackage[english,ukrainian]{babel}

2.1.2 LuaLaTeX

    \usepackage[T1,T2A]{fontenc}
    \usepackage[lutf8]{luainputenc}
    \usepackage[english,ukrainian]{babel}

2.1.3 XeLaTeX

    \XeTeXinputencoding "bytes"
    \usepackage[utf8]{inputenc}
    \usepackage[T2A]{fontenc}
    \usepackage[english,ukrainian]{babel}

2.2 Unicode mode, LuaLaTeX or XeLaTeX

    \usepackage{fontspec}
        \defaultfontfeatures{Ligatures={TeX}}
        \setmainfont{CMU Serif}
        \setsansfont{CMU Sans Serif}
        \setmonofont{CMU Typewriter Text}
    \usepackage[english,ukrainian]{babel}

Instead of the Computer Modern Unicode (CMU) fonts loaded in this example,
you may try any True Type or Open Type font installed on your computer provided
that that font came with Ukrainian letters.

3. DOCUMENTATION

See ukraineb.pdf for more information.


4. KNOWN PROBLEMS

Before switching from a legacy 8-bit engine (tex, pdftex) to an Unicode
engine (xetex, luatex) and vise versa delete all .aux, .toc, .lot, .lof
files as they might have stored incompatible internal encodings.

5. CHANGES

2026-05-27 version 1.5a
   * Fixed extra \EndBabelCommands in non-Unicode (pdflatex) captions branch.

2026-05-24 version 1.5
   * Fixed TU font encoding missing from StartBabelCommands (broke Unicode mode with modern fontspec).
   * Fixed \math@th operator defined as arctg instead of th (copy-paste bug).
   * Fixed \nomname and \notesname missing \cyr wrapper in non-Unicode branch.
   * Added nomencl eqdeclaration/pagedeclaration to non-Unicode branch (was only in Unicode).
   * Fixed \lstlistlistingname: changed from "Лістинги" to "Перелік лістингів" for consistency.
   * Added \algorithmname, \hypothesisname, \theoremname caption strings.
   * Fixed version tag 1.4c: had Cyrillic 'с' instead of Latin 'c'.
   * Fixed email address in preamble (missing dot before 'com').
   * Various typo fixes in documentation and comments.
   * Fixed \ccname Unicode branch: was "вих." (outgoing), now "копія" (carbon copy) -- semantically correct.
   * Fixed \tablename non-Unicode branch: was "Табл." (abbreviated), now "Таблиця" -- matches Unicode branch.
   * Fixed \enclname non-Unicode branch: was "вкладка" (full form), now "вкл." -- matches Unicode branch.

2020-10-13 version 1.4e
   * Preventing a problem with duplicate math operators in russian.ldf.

2020-10-13 version 1.4d
   * Added support for pdfstrings.

2018-04-11 version 1.4c
   * Fixed unprotected endlines.

2017-08-10 version 1.4b

    * Default for \cyrdash is provided.
    * TU encoding is set as default for XeTeX and LuaTeX; EU1 and EU2 encodings
      are kept for backward compatibility.

2017-06-13 version 1.4a

    * Removing \week<roman number>day macro, since it should be defined in datetime2 class
    * Removing revtex4(4-1) classes ukrainization because it is unused in Ukrainian text typesetting
    * Adding \acronymname, \lstlistingname and \lstlistlistingname macros to nonunicode captions

2017-06-10 version 1.4

    * For compatibility with older Ukrainian packages we leave definition of the \No macro
    * Fix Ukrainian translation of babel unicode string \chaptername
    * Macros \Asbuk and \asbuk are removed
    * Cyrillic alphabetical enumeration is provided by \Alph and \alph macros when Ukrainian loaded
    * Used babel's 3.9 (and later) macros for defining caption names and date for Unicode case

2017-06-08 version 1.3i

    * Corrections according to alphabetical enumeration Ukrainian standard ДСТУ 3008:2015
    * Some math macro from original russian.ldf was removed because of seldom usage

2017-06-06 version 1.3h

    * Initial version

Original source:  russianb.dtx,
    2017-01-12 v1.3i Russian support from the babel system.

----------------------------------------------------------------
%</readme>
%<*internal>
\fi
\def\nameofplainTeX{plain}
\ifx\fmtname\nameofplainTeX\else
  \expandafter\begingroup
\fi
%</internal>
%<*install>
\input docstrip.tex
\keepsilent
\askforoverwritefalse
\preamble
----------------------------------------------------------------
Ukrainian Language Support for the Babel package
E-mail: sergiy.ponomarenko@gmail.com
Released under the LaTeX Project Public License v1.3c or later
See http://www.latex-project.org/lppl.txt
----------------------------------------------------------------
\endpreamble
\postamble
----------------------------------------------------------------
Copyright 2017 Sergiy М. Ponomarenko
Copyright 2011-2017 Igor A. Kotelnikov.
Copyright 2000 Aleksey Novodvorsky
Copyright 1995-2008 Olga Lapko.
Copyright 1989-2012 Johannes L. Braams.

This file is a part of the Ukrainian-Babel package.

It may be distributed and/or modified under the
conditions of the LaTeX Project Public License (LPPL), either
version 1.3c of this license or (at your option) any later
version.  The latest version of this license is in the file:

   http://www.latex-project.org/lppl.txt

The package is "maintained" (as per LPPL maintenance status) by
Sergiy М. Ponomarenko.

The package consists of the file  ukraineb.dtx
and the derived files             ukraineb.ins,
                                  ukraineb.ldf,
                                  ukraineb.pdf,
                                  README.
----------------------------------------------------------------
\endpostamble
\usedir{tex/generic/babel/contrib}
\generate{
    \file{\jobname.ldf}{\from{\jobname.dtx}{code}}
}
%</install>
%<install>\endbatchfile
%<*internal>
\usedir{source/latex/babel-ukrainian}
\generate{
    \file{\jobname.ins}{\from{\jobname.dtx}{install}}
}
\nopreamble\nopostamble
\usedir{doc/latex/babel-ukrainian}
\generate{
    \file{README.}{\from{\jobname.dtx}{readme}}
}
\ifx\fmtname\nameofplainTeX
    \expandafter\endbatchfile
\else
    \expandafter\endgroup
\fi
%</internal>
%<*code>
\NeedsTeXFormat{LaTeX2e}
%\ProvidesLanguage{\jobname}[2026/05/27 1.5a Ukrainian support for the Babel system]
\ProvidesFile{ukraineb.ldf}[2026/05/27 1.5a Ukrainian support for the Babel system]
%</code>
%<*driver>
\documentclass[a4paper]{ltxdoc}
%%
%% This document should be compiled by
%% XeLaTeX or LuaLaTex since some cyrillic
%% glyphs are absent in T2* encodings used
%% by LaTeX.
%%
\usepackage[%
    a4paper,%
    footskip=1cm,%
    headsep=0.3cm,%
    top=2cm, %поле сверху
    bottom=2cm, %поле снизу
    left=4cm, %поле ліворуч
    right=2cm, %поле праворуч
    ]{geometry}
\usepackage{ifxetex,ifluatex}
\ifnum 0\ifxetex 1\fi\ifluatex 1\fi>0
    \usepackage{fontspec}
    \defaultfontfeatures{Ligatures={TeX}}
    \setmainfont{CMU Serif}
    \setsansfont{CMU Sans Serif}
    \setmonofont{CMU Typewriter Text}
    %\setmonofont[Scale=MatchLowercase]{Courier New}
    %\setmonofont[Scale=MatchUppercase]{Courier New}
    %\setmonofont{Courier New}
\else
    \usepackage[X2,T2A]{fontenc}
    \usepackage[utf8]{inputenc}
    %% ukrainian letter, looks as a ligature IE, not defined anywhare
    %\DeclareUnicodeCharacter{0464}{\CYRESHRT} % no surch cmd in X2
    %% ukrainian letter, looks as a ligature ie, not defined anywhare
    %\DeclareUnicodeCharacter{0465}{\cyreshrt} % no surch cmd in X2
    %% therefor, we substitute it with є (#0454, \cyrie)
    \DeclareUnicodeCharacter{0464}{\CYRIE}%
    %\DeclareTextSymbolDefault{\CYRIE}{X2}
    \DeclareUnicodeCharacter{0465}{\cyrie}%
    %\DeclareTextSymbolDefault{\cyrie}{X2}
\fi
\usepackage[dvipsnames,usenames]{xcolor}
\usepackage{colortbl}
    \definecolor{thered}  {rgb}{0.65,0.04,0.07}
    \definecolor{thegreen}{rgb}{0.06,0.44,0.08}
    \definecolor{thegrey} {gray}{0.8}
    \definecolor{theshade}{rgb}{1,1,0.97}
    \definecolor{theframe}{gray}{0.6}
    \definecolor{theblue}{cmyk}{1.00, 0.50, 0.00, 0.40}
%\usepackage[numbered]{hypdoc}
\usepackage[colorlinks=true
    ,linkcolor=violet %theblue %
    ,filecolor=purple %thegreen%
    ,citecolor=teal   %thegreen%
    ,pdfpagelayout=TwoPageRight%
    ,pdfauthor={Ponomarenko S.M. aka sergiokapone}%
    ,pdfdisplaydoctitle=true%
    ,pdfencoding=auto%
     ]{hyperref}
% ====================================
\newcommand*\TeXhax{\TeX hax}
\newcommand*\babel{\textsf{babel}}
\newcommand*\Babel{\textsf{Babel}}
\newcommand*\xetex{\textsf{xetex}}
\newcommand*\luatex{\textsf{luatex}}
\providecommand*\m[1]{\mbox{$\langle$\normalfont\itshape#1\/$\rangle$}}
\newcommand*\langlist{%
    \meta{language}\texttt{,}\meta{language}\texttt{,}...}
\newcommand*\langvar{\m{lang}}
\newcommand*\note[1]{}
\newcommand*\Lopt[1]{\textsf{#1}}
\newcommand*\Lenv[1]{\textsf{#1}}
\newcommand*\menv[1]{\char`\{#1\char`\}}
\newcommand*\Eenv[1]{%
    \quad\ldots\quad
    \texttt{\color{thered}\string\end\menv{#1}}}
\newcommand*\file[1]{\texttt{#1}}
\newcommand*\cls[1]{\texttt{#1}}
\newcommand*\pkg[1]{\texttt{#1}}
% --------------------------------------------------
\IfFileExists{listings.sty}{
    \usepackage{listings}
    \lstset{
        gobble=1,
        columns=flexible,
        keepspaces,
        basicstyle=\MacroFont,
        keywords=[0]{\selectlanguage,\foreignlanguage
         ,\babelhyphen,\babelhyphenation
         ,\lefthyphenmin,\righthyphenmin
         ,\StartBabelCommands,\SetString,\EndBabelCommands,\shorthandoff,\shorthandon
         ,\languageshorthands,\useshorthands,\defineshorthand
         ,\AddBabelHook,\SetStringLoop,\SetCase,\AfterBabelLanguage
         ,\defaultfontfeatures,\setmainfont,\setsansfont,\setmonofont
         ,\Ukrainian,\cyrdash,\cdash
         ,\cyr,\cyrillictext,\textcyrillic,\cyrillicencoding
         ,\addto,\captionsukrainian,\dateukrainian,\noextrasukrainian,\extrasukrainian
         ,\languageattribute
         ,\ch,\sh,\tg,\ctg,\arctg,\arcctg\,\th,\cth,\cosec
         ,\dq
         ,\XeTeXinputencoding
        }
        ,keywordstyle=[0]\color{thered}
        ,keywords=[1]{main,ukrainian,english,german,frenchb
         ,shorthands,extrasenglish
         ,stringprocess,afterextras
         ,soft,empty,nobreak,hard
         ,Renderer,Ligatures
         ,T1,T2A,lutf8,utf8
         ,fontspec,babel,inputenc,fontenc
         },
        keywordstyle=[1]\color{thegreen},
        comment=[l]\%,
        commentstyle=\color{thegrey}\itshape,
        alsoother={0123456789_},
        frame=single,
        backgroundcolor=\color{theshade},
        rulecolor=\color{theframe},
        framerule=\fboxrule,
    }
    \let\verbatim\relax
    \lstnewenvironment{verbatim}[1][]{\lstset{##1}}{}
    \AtBeginDocument{%
      \DeleteShortVerb{\|}%
      \lstMakeShortInline|%
    }
}{}
\def\PrintDescribeMacro#1{%
    \strut\MacroFont\color{thered}\normalsize\string#1}
\def\Describe#1{%
    \par\penalty-500\vskip3ex\noindent
    \DescribeMacro{#1}\args}
\def\DescribeOther{\vskip-5.8ex\Describe}
\makeatletter
\def\args#1{%
    \def\bbl@tempa{#1}%
    \ifx\bbl@tempa\@empty\else#1\vskip1ex\fi\ignorespaces}
\makeatother
% ====================================
\EnableCrossrefs
%\DisableCrossrefs   % Say \DisableCrossrefs if index is ready
\CodelineIndex       % Index code by line number
\RecordChanges       % Gather update information
%\PageIndex          % Index code by page number
% ====================================
\begin{document}
  \DocInput{\jobname.dtx}
\end{document}
%</driver>
% \fi
%
% \GetFileInfo{\jobname.dtx}
% \GetFileInfo{\jobname.ldf}
%
% \title{^^A
%     \textsf{Ukrainian} --- description text\thanks{^^A
%        This file describes version \fileversion, last revised \filedate.^^A
%      }^^A
% }
% \author{^^A
%   You\thanks{E-mail: you@your.domain}^^A
% }
% \title{The Ukrainian Language\\
%     in the \babel\ system\\[0.5em]
%     \large Version \fileversion}
%
% \author{Sergiy M. Ponomarenko\footnote{E-mail: \href{mailto:sergiy.ponomarenko@gmail.com}{sergiy dot ponomarenko at gmail dot com}.}}
%
% \date{Released \filedate}
%
% \maketitle
%
% {\small\tableofcontents}
%
%
% \section{The Ukrainian Language Definition File}
%
% The file \file{\filename}\footnote{The file described in this document
% has the version number \fileversion\ and was last revised on \filedate.}
% is the source file for the Ukrainian Language Definition file
% \file{\jobname.ldf} to be loaded by the \babel\ package with
% the option \Lopt{ukrainian}. It's based on the Russian language definition
% file \file{russianb.ldf} derived by Igor~A.~Kotelnikov.
%
% \section{Usage}
%
% Typesetting Ukrainian texts implies that a special input and output
% encodings should be used. Input encodings are those which are used in source
% (\file{.tex}) file. Output encoding is also known as the font encoding. It is
% implemented within the font files.
%
% Generally, the user may choose between different available Cyrillic
% encodings. The current support for Cyrillic uses LH family of MetaFont fonts
% and theirs Postscript versions such as \texttt{CM-super}. Lua\LaTeX\ and Xe\LaTeX,
% being the Unicode-based succeeders of \LaTeX, allow also for any Open Type
% (OTF) and True Type (TTF) fonts which has Cyrillic script, e.g. Computer
% Modern Unicode, Linux Libertine, and many other system fonts that came with
% Linux, Mac and Windows operating systems.
%
% With the advent of Unicode, \LaTeX\ community are moving towards eliminating
% all existing encodings in favor of Unicode, but nowadays one should take
% care when switching from \LaTeX\ to Lua\LaTeX\ or Xe\LaTeX\ since
% different packages should be loaded for those compilers.
%
% Since earlier versions \babel{} did not
% support Xe\LaTeX\ (at least for some languages including Ukrainian), the
% \pkg{polyglossia} package was generally recommended in the past for
% use with Xe\LaTeX\ as a replacement for \babel. Nowadays, \babel{}
% can be used with any engines, including \LaTeX, PDF\LaTeX, Lua\LaTeX, and
% Xe\LaTeX. Nevertheless some troubles may occur with some languages which
% have no promptly updated \file{.ldf} files.
%
%
% \subsection{\LaTeX}
%
% When user's document is compiled with \file{latex.exe} or \file{pdflatex.exe},
% recommended set of packages  includes the \pkg{inputenc} and \pkg{fontenc}
% packages. They should be loaded before \babel, for example,
% \begin{verbatim}
%    \usepackage[T1,T2A]{fontenc}
%    \usepackage[utf8]{inputenc}
%    \usepackage[english,ukrainian]{babel}
%\end{verbatim}
% Some variations in the order of loading the packages are allowed in this case
% but it is better to follow one and the same convention at all circumstances:
% the \babel{} package should go last, and \pkg{fontenc} must be the first.
%
% Input encoding should be declared as option to the \pkg{inputenc}
% package. Known Cyrillic encodings include \texttt{cp866} (MS DOS),
% \texttt{cp1251} (Windows), \texttt{koi8-u} (UNIX) and their variants.
% Nowadays, this list is appended with \texttt{utf8} input encoding.
%
% Output encodings (also known as font encodings) are declared as options to
% the \pkg{fontenc} package. Known Cyrillic encodings are \texttt{T2A},
% \texttt{T2B}, \texttt{T2C}, \texttt{LCY},  and \texttt{X2};
% \texttt{LWN} is excluded from Ukrainian support of
% \file{\filename} since \texttt{LWN} is excluded from the \pkg{cyrillic}
% bundle of related files.
%
%
% \subsection{Lua\LaTeX}
%
% If Unicode fonts are not available, Lua\LaTeX\ can run in compatibility
% (8-bit) mode to use same font as \LaTeX\ does. However the package
% \pkg{inputenc} does not work with Lua\LaTeX\ and should be substituted with
% \pkg{luainputenc}. Source file is to be converted to \texttt{UTF8}
% (Unicode-8) encoding; it is the only input encoding accepted by
% Lua\LaTeX. The 8-bit mode is invoked by the following sequence of packages:
% \begin{verbatim}
%     \usepackage[T1,T2A]{fontenc}
%     \usepackage[lutf8]{luainputenc}
%     \usepackage[english,ukrainian]{babel}
% \end{verbatim}
% The order of the packages is crucial for Lua\LaTeX\ in 8-bit mode. Since both
% \pkg{luainputenc} and \babel{} should know what is a selected font encoding,
% the \pkg{fontenc} package should be loaded first. Input encoding management for
% Lua\TeX\ is needed only for compatibility with old documents. For new
% documents, using UTF-8 encoding and Unicode fonts is strongly recommended.
% \emph{You've been warned!} See
% \href{http://tex.stackexchange.com/questions/31709/can-one-instruct-lualatex-to-use-t2a-encoded-fonts}%
% {tex.stackexchange.com/questions/31709/can-one-instruct-lualatex-to-use-t2a-encoded-fonts}.
%
%
% To invoke Unicode mode, one needs to load the \pkg{fontspec} package instead
% of \pkg{luainputenc} and \pkg{fontspec} and explicitly indicate which True Type
% or Open Type fonts should be used for romanic, sans-serif and monospaced types.
% The following example shows how to load Computer Modern Unicode (CMU) fonts,
% which is a part of all modern \LaTeX\ distributions:
% \begin{verbatim}
%     \usepackage{fontspec}
%     \defaultfontfeatures{Renderer=Basic,Ligatures={TeX}}
%         \setmainfont{CMU Serif}
%         \setsansfont{CMU Sans Serif}
%         \setmonofont{CMU Typewriter Text}
%     \usepackage[english,ukrainian]{babel}
% \end{verbatim}
% The |\defaultfontfeatures| declares default font features for subsequent
% |\setmainfont| (which sets romanic fonts), |\setsansfont| (sans-serif) and
% |\setmonofont| (monospaced font). Font features can be set up on per font
% bases; for example
% \begin{verbatim}
%     \usepackage{fontspec}
%         \setmainfont[Renderer=Basic,Ligatures={TeX}]{CMU Serif}
%         \setsansfont[Renderer=Basic,Ligatures={TeX,Historic}]{CMU Sans Serif}
%         \setmonofont{CMU Typewriter Text}
%     \usepackage[english,ukrainian]{babel}
% \end{verbatim}
% Here |Renderer=Basic,Ligatures={TeX}| activates ligatures which are existed
% in \LaTeX.
%
% Recall that the language enlisted last in the list of options of the \babel{}
% package is assumed to be the main language of the document, which is also active
% language right after |\begin{document}|. As of version 3.9, the main language
% can be set as a value of the |main| option as follows
% \begin{verbatim}
%      \usepackage{fontspec}
%      \usepackage[english,main=ukrainian,german]{babel}
% \end{verbatim}
% %\unskip
%
%
%
% \subsection{Xe\LaTeX}
%
% In Xe\LaTeX, there is also a special mode for 8-bit compatibility.
% One can use |\XeTeXinputencoding| to change the input encoding
% temporarily, and the \texttt{"bytes"} encoding makes Xe\LaTeX\ works
% like a 8-bit \LaTeX\ engine:
% \begin{verbatim}
%     \XeTeXinputencoding "bytes"
%     \usepackage[utf8]{inputenc}
%     \usepackage[T2A]{fontenc}
%     \usepackage[english,ukrainian]{babel}
% \end{verbatim}
% \unskip
% Xe\TeX\ can use a different input encoding but it always uses the Unicode
% internally, so that |\XeTeXinputencoding| performs a conversion of the input
% into Unicode;
%
% \noindent%
% see \href{http://tex.stackexchange.com/questions/36188/do-xetex-and-luatex-always-use-unicode}
% {tex.stackexchange.com/questions/36188/do-xetex-and-luatex-always-use-unicode}.
%
%
% Unicode mode is set up same way as for Lua\LaTeX, however the option
% |Renderer=Basic| can be dropped:
% \begin{verbatim}
%     \usepackage{fontspec}
%          \defaultfontfeatures{Ligatures={TeX}}
%          \setmainfont{CMU Serif}
%          \setsansfont{CMU Sans Serif}
%          \setmonofont{CMU Typewriter Text}
%     \usepackage[english,ukrainian]{babel}
% \end{verbatim}
%
% \section{User's commands}
%
% In a multilingual document, some typographic rules are language
% dependent and should apply to the whole document.
%
% Regarding local typography, the macro |\selectlanguage{ukrainian}|
% switches to the Ukrainian language, with the following effects:
% \begin{enumerate}
% \item Ukrainian hyphenation patterns are made active;
% \item |\today| prints the date in Ukrainian;
% \item the caption names are translated into Ukrainian
%      (\LaTeX{} only);
% \item emdash typed by the ligature |---| might be 20\% shorter when Ukrainian
% is the current language; the result depends on the current encoding; |---|
% always produce long emdash in Lua\TeX\ and Xe\TeX\ since these engines
% use same encodings for all languages;
% \item emdash typed by the ligature |"---| in Ukrainian is 20\% shorter, however
% the ligature |"---| might not be defined in other languges; a
%      shorter emdash (i.e. |\cyrdash|) can be typeset in any language using
%      special macros enlisted in table \ref{tab:ukrainian-quote}.
% \end{enumerate}
%
% Additional commands are provided to typeset quotes:
%
% \begin{enumerate}
% \item French quotation marks can be entered using the commands
%      |\guillemotleft| and |\guillemotright| which work in \LaTeXe\
%      and Plain\TeX.
% \item German quotation marks can be entered using the commands
%      |\glqq| and |\grqq| which work in \LaTeXe\ and Plain\TeX.
% \end{enumerate}
%
% The macro |\Ukrainian| defined as an alias for
% |\selectlanguage{ukrainian}|, and its ``opponent'' |\English|, existed
% in \file{\jobname.ldf} has been removed since the Ukrainian
% language definition file is wrong place for definition of macros which
% switch to a distinct other language.
%
% The macro |\textcyrillic|\marg{text} is intended to typeset small chunks of text
% in Ukrainian; it is essentially an alias for |\foreignlanguage{ukrainian}|\marg{text}.
%
%
% \subsection{Active character}
%
% Table~\ref{tab:ukrainian-quote} shows macros and active string which can be
% used to typeset various dashes and quotes.
% In the Ukrainian language, the character |"| is made active. It can be
% considered as second escape character in addition to |\|. Some dashes and
% all quotes can be typed using both active character |"| and ordinary
% macros as indicated in the table. However, some shorthanded hyphenations
% have no macro counterpart.
%
% \begin{table}[!ht]\centering
%  \caption{Extra definitions made
%           by \file{\jobname.ldf}}\label{tab:ukrainian-quote}
%  \medskip
%  \begin{tabular}{llp{7cm}}
%  \hline\hline\\[-0.5em]
%   |\glqq| & |"`| &
%       German opening double quote (looks like ,\kern-0.08em,).     \\
%   |\grqq| & |"'| &
%       German closing double quote (looks like ``).                \\
%   |\guillemotleft| & |"<| &
%       French opening double quote (looks like $<\!\!<$).           \\
%   |\guillemotright| & |">| &
%       French closing double quote (looks like $>\!\!>$).          \\
%   |\dq|   &  &
%       Original quotes character (|"|).                       \\[0.5em]
%   |\babelhyphen{soft}|
%   & |"-| & Optional (soft) hyphen sign, similar to |\-| but allows
%            hyphenation in the rest of the word;
%            equivalent to |\babelhyphen{soft}| in \babel{} 3.9. \\
%   |\babelhyphen{empty}|
%   & |""| & Similar to |"-| but prints no hyphen sign
%            (used for compound words with hyphen, e.g. |x-""y|);
%            equivalent to |\babelhyphen{empty}| in \babel{} 3.9. \\
%   |\babelhyphen*{nobreak}|
%   & |"~| & Compound word mark without a breakpoint, prints hyphen
%            prohibiting hyphenation at the point;
%            equivalent to |\babelhyphen*{nobreak}| in \babel{} 3.9. \\
%   |\babelhyphen{hard}|
%   & |"=| & A compound word mark with a breakpoint, prints hyphen
%            allowing hyphenation in the composing words.
%            equivalent to |\babelhyphen{hard}| in \babel{} 3.9. \\
%   |\babelhyphen{nobreak}|
%   & \verb="|= & Disables ligature at this position;
%            equivalent to |\babelhyphen{nobreak}| (??) in \babel{} 3.9.
%                                                                  \\[0.5em]
%   |\cyrdash|  &        & Row Cyrillic emdash (does not care
%       spaces around).                                            \\
%   |\cdash---| & |"---| &
%       Cyrillic emdash in plain text.                              \\
%   |\cdash--~| & |"--~| &
%       Cyrillic emdash in compound names
%                                 (as in |Mendeleev"--~Klapeiron|). \\
%   |\cdash--*| & |"--*| &
%       Cyrillic emdash for denoting direct speech.                           \\
%   & |",| & Thin space
%               (allows further hyphenation as in |D.",Mendeleev|). \\[0.5em]
%  \hline\hline
%  \end{tabular}
% \end{table}
% Note that the standard soft hyphen |\-| is equivalent to |\babelhyphen*{soft}|.
%
% \medskip
%
% The quotation marks traditionally used in Ukrainian were borrowed from
% other languages (e.g., French and German) so they keep their original
% names.
%
% The French quotes are also available as ligatures `|<<|' and `|>>|' in
% 8-bit Cyrillic font encodings (\texttt{LCY}, \texttt{X2}, \texttt{T2*})
% and in Unicode encodings (\texttt{EU1} and \texttt{EU2})
% and as `|<|' and `|>|' characters in 7-bit Cyrillic font encodings
% (\texttt{OT2} and \texttt{LWN}).
%
% In Unicode encodings \texttt{EU1} and \texttt{EU2} cyrdashes and quotes
% can be typed as single character if text editor makes it possible to
% insert characters which absent of standard keyboard. This method works
% as well for 8-bit fonts encoded according to \texttt{T2A} if source file
% is encoded with \texttt{cp1251} or {utf8}.
%
% By default, active double quote is switched on. It can be switched off
% any time using |\shorthandoff{"}| and the switched on again using
% |\shorthandon{"}|.
%
% \subsection{Math commands}
%
% The \file{\filename} defines few macros that can be used independently
% of current language. These are macros to be used in math mode to type
% the names of trigonometric functions common for Ukrainian documents:
% |\sh|, |\ch|, |\tg|, |\ctg|, |\arctg|, |\arcctg|, |\th|, |\cth|, and
% |\cosec|. Cyrillic letters in math mode can be typed with the aid of
% text commands such as |\textbf|, |\textsf|, |\textit|, |\texttt|, e.t.c.
%
%
% \section{\TeX{}nical details}
%
% The packages \pkg{inputenc} and  \pkg{luainputenc}
% make Cyrillic letters active so that a compiler converts them into
% corresponding |\cyr<letter>| macro at compilation time.
% For example, Ukrainian letter `a' matches
% macro |\cyra|, and capital Ukrainian letter `A' matches |\CYRA|. The
% package \pkg{fontenc} then matches every macro |\cyr<letter>| to corresponding
% glyph in a font file depending on a declared font encoding.
%
% Nowadays, Unicode makes |\cyr<letter>| macros outdated since both source
% file and font file are encoded consistently. These macros
% should therefore be removed because mixing them with Unicode characters
% breaks sorting mechanism of such utilities as \file{bibtex} and
% \file{makeindex}. For the sake of backward compatibility, |\cyr<letter>| are
% still kept for \LaTeX, but they are bypassed if Lua\LaTeX\ or  Xe\LaTeX\
% are detected.
%
% \section{Known problems}
%
% Before switching from a legacy 8-bit engine (tex, pdftex) to an Unicode
% engine (xetex, luatex) and vise versa delete all |.aux|, |.toc|, |.lot|,
% |.lof| files as they might have stored incompatible internal encodings.
%
%
% \StopEventually{^^A
%   \setlength{\postmulticols}{100pt}
%   \PrintChanges
%   \PrintIndex
% }
%
% \iffalse
%<*code>
% \fi
%
% \section{Implementation}
% \changes{1.5}{2026/05/24}{Fixed TU encoding in StartBabelCommands for modern fontspec}
% \changes{1.5}{2026/05/24}{Fixed \cs{math@th} operator was incorrectly defined as arctg}
% \changes{1.5}{2026/05/24}{Fixed missing \cs{cyr} wrapper in non-Unicode \cs{nomname} and \cs{notesname}}
% \changes{1.5}{2026/05/24}{Added nomencl declarations to non-Unicode branch}
% \changes{1.5}{2026/05/24}{Added \cs{algorithmname}, \cs{hypothesisname}, \cs{theoremname}}
% \changes{1.5}{2026/05/24}{Fixed \cs{lstlistlistingname} to use full form ``Перелік лістингів''}
% \changes{1.5}{2026/05/24}{Fixed \cs{ccname} Unicode branch: ``вих.'' corrected to ``копія''}
% \changes{1.5}{2026/05/24}{Fixed \cs{tablename} non-Unicode branch: ``Табл.'' corrected to ``Таблиця''}
% \changes{1.5}{2026/05/24}{Fixed \cs{enclname} non-Unicode branch: ``вкладка'' corrected to ``вкл.''}
% \changes{1.5}{2026/05/24}{Fixed version tag 1.4c: contained Cyrillic `с' instead of Latin `c'}
% \changes{1.5}{2026/05/24}{Fixed email address in preamble (missing dot before `com')}
% \changes{1.5}{2026/05/24}{Various typo fixes in documentation and comments}
% \changes{1.4e}{2020/10/14}{Preventing a problem with duplicate math operators in russian.ldf}
% \changes{1.4d}{2020/10/13}{Added support for pdfstrings}
% \changes{1.4a}{2017/06/13}{Removing \cs{week<roman number>day} macro, since it is should be define in \cls{datetime2} class}
% \changes{1.4a}{2017/06/13}{Removing \cls{revtex4(4-1)} classes ukrainization because it is unused in Ukrainian text typesetting}
% \changes{1.4a}{2017/06/13}{Adding \cs{acronymname}, \cs{lstlistingname} and \cs{lstlistlistingname} macros to nonunicode captions}
% \changes{1.4}{2017/06/10}{For compatibility with older Ukrainian packages we leave definition of the \cs{No} macro}
% \changes{1.4}{2017/06/09}{Fix Ukrainian translation of babel unicode string \cs{chaptername}}
% \changes{1.4}{2017/06/09}{Macros \cs{Asbuk} and \cs{asbuk} are removed}
% \changes{1.4}{2017/06/09}{Cyrillic alphabetical enumeration is provided by \cs{Alph} and \cs{alph} macros when Ukrainian loaded}
% \changes{1.4}{2017/06/09}{Used babel's 3.9 (and later) macros for defining caption names and date for Unicode case}
% \changes{1.3i}{2017/06/08}{Corrections according to alphabetical enumeration Ukrainian standard ДСТУ 3008:2015}
% \changes{1.3i}{2017/06/08}{Some math macro from original russian.ldf was removed because of seldom usage}
% \changes{1.3h}{2017/06/06}{Initial version}
%
% \subsection{Initial setup}
%
% The macro |\LdfInit| performs a couple of standard checks that
% must be made at the beginning of a language definition file,
% such as checking the category code of the \texttt{@}-sign, preventing
% the \file{.ldf} file from being processed twice, etc.
%
%    \begin{macrocode}
\LdfInit{ukrainian}{captionsukrainian}
%    \end{macrocode}
%
% First, we check if Lua\LaTeX\ or Xe\LaTeX\ is running. If so, we set
% boolean key |\if@ukr@uni@ode| to true. It will be used to eliminate |\cyr...|
% commands, which were introduced in \LaTeX2e\ to handle various
% Cyrillic input encoding. With the advent of Unicode \LaTeX\ is
% moving to universal input encoding, so we consider these |\cyr...|
% commands as obsolete. They are preserved though for backward
% compatibility in case if \LaTeX\ or PDF\LaTeX\ are running.
%
% We don't load the \pkg{ifluatex} or \pkg{ifxetex} package because
% |\RequirePackage| is not allowed at the stage of processing options
% (note that babel loads this file right when it processes its own options)
% but we borrow code from these packages.
%
%    \begin{macrocode}
\ifdefined\if@ukr@uni@ode
    \PackageError{babel}{if@ukr@uni@ode already defined.\MessageBreak
        Please contact author of ukraineb.ldf}
    \relax
\fi
\newif\if@ukr@uni@ode
\ifdefined\luatexversion
    \@ukr@uni@odetrue
\else
    \ifdefined\XeTeXrevision
        \@ukr@uni@odetrue
    \fi
\fi
%    \end{macrocode}
%
% Check if hyphenation patterns for the Ukrainian language have been
% loaded in \file{language.dat}. Namely, we check for the existence of
% |\l@ukrainian|. If it is not defined, we declare Ukrainian as dialect
% for the default language number 0 which almost for sure is English.
%
%    \begin{macrocode}
\ifx\l@ukrainian\@undefined
    \@nopatterns{Ukrainian}
  \adddialect\l@ukrainian0
\fi
%    \end{macrocode}
% Now |\l@ukrainian| is always defined.
%
% \subsection{Output encoding}
%
% We need to know font encoding that is supposed to be
% active at the end of the \babel\ package. Default font encoding, set by
% \LaTeX\ core, is \texttt{OT1}. This can be changed by the \pkg{fontenc}
% package in case of \LaTeX\ and by \pkg{fontspec} package in case of
% Lua\LaTeX. It matters weather these packages are loaded before of after
% \babel. In the latter case or if these packages are not loaded at all,
% \file{ukraineb.ldf} ignores their effect and tries to provide some
% reasonable settings. In particular, \texttt{T2A} will be selected for
% Ukrainian language if \LaTeX\ is running but \texttt{EU1} in case of
% Xe\LaTeX\ and \texttt{EU2} in case of Lua\LaTeX.
%
%
% In Unicode mode, the package \pkg{fontspec} should be loaded instead of
% \pkg{fontenc} to make font preparation; \pkg{fontspec} loads the package
% \pkg{xunicode} which sets current encoding (kept in |\cf@encoding|) to
% \texttt{EU1} for Xe\LaTeX\ and \texttt{EU2} for Lua\LaTeX, and the \babel{}
% package sets the macro |\latinencoding| to |\cf@encoding|. Since \babel{} scan
% for value |\cf@encoding| within |\AtBeginDocument|, |\latinencoding| will
% be set to either \texttt{EU1} for Xe\LaTeX\ or \texttt{EU2} for Lua\LaTeX\
% no matter which of the packages, \babel{} or \pkg{fontspec} is loaded first.
%
%
% \Describe\cyrillicencoding{}
%  There is a limited list of encodings appropriate for Cyrillic text. We
%  will look which of them is declared and keep its name in the macro
%  |\cyrillicencoding|.
%  Correct (but obsolete and now deleted) 7-bit Cyrillic encoding is
%  \texttt{LWN}.
%  Correct 8-bit Cyrillic encodings are
%  \texttt{T2A} (default for 8-bit compilers), \texttt{T2B}, \texttt{T2C},
%  \texttt{LCY} and \texttt{X2}.
%  Correct utf8 encodings are
%  \texttt{TU}  (default for Xe\LaTeX\ and Lua\LaTeX),
%  \texttt{EU1} (obsolete, formerly used for Xe\LaTeX),
%  \texttt{EU2} (obsolete, formerly used for Lua\LaTeX).
%
%  In 8-bit (\LaTeX) mode, user may choose between different non-unicode Cyrillic
%  encodings---e.g., \texttt{X2} or \texttt{LCY}.\@ If user wants
%  to use another font encoding rather than default (\texttt{T2A}),
%  he has to load the corresponding file \emph{before} \file{babel.sty}.
%
%  Remember that for the Ukrainian language, the \texttt{T2A} encoding is
%  better than \texttt{X2}, because \texttt{X2} does not contain Latin
%  letters, and users should be very careful to switch the language
%  every time they want to typeset a Latin word inside a Ukrainian phrase
%  or vice versa.
%
%  We parse the |\cdp@list| containing encodings known to \LaTeX\
%  in the order they have been loaded by the time \pkg{babel} is called.
%  We set the |\cyrillicencoding| to the \emph{last} loaded encoding in the
%  list of supported Cyrillic encodings: \texttt{OT2}, \texttt{LCY},
%  \texttt{X2}, \texttt{T2C}, \texttt{T2B}, \texttt{T2A}. In Unicode mode,
%  |\cyrillicencoding| is set to \texttt{TU} by \pkg{fontspec}. Nevertheless
%  here we provide similar definitions; 8-bit encodings are kept for Unicode
%  compilers (Lua\LaTeX\ and Xe\LaTeX) since they can run in compatibility
%  (8-bit) mode.
%
% \changes{1.4b}{2017/08/10}{TU encoding added}
%    \begin{macrocode}
\def\@setcyrillicencoding{%
    \def\sce@a##1##2{%
        \edef\sce@b{##1}%
        \edef\sce@c{##2}%
        \ifx\sce@b\sce@c
            \let\cyrillicencoding\sce@c
        \fi}%
    \def\cdp@elt##1##2##3##4{%
        \sce@a{##1}{OT2}%
        \sce@a{##1}{LCY}%
        \sce@a{##1}{X2}%
        \sce@a{##1}{T2C}%
        \sce@a{##1}{T2B}%
        \sce@a{##1}{T2A}%
        \if@ukr@uni@ode
            %\sce@a{##1}{EU1}%
            %\sce@a{##1}{EU2}%
            \sce@a{##1}{TU}%
        \fi}%
     \cdp@list
}
\ifx\cyrillicencoding\undefined
  \@setcyrillicencoding
\fi
\@onlypreamble\@setcyrillicencoding
\@onlypreamble\sce@a
\@onlypreamble\sce@b
\@onlypreamble\sce@c
%    \end{macrocode}
%    The last lines are to free the memory occupied by the macros
%    |\@setcyrillicencoding| and |\sce@x| that are useless in the document.
%    The contents of |\@begindocumenthook| is cleared automatically.
%
%    If |\cyrillicencoding| is still undefined, we issue warning and provide
%    reasonable default value for |\cyrillicencoding|. We then load default
%    encoding definitions; we use the lowercase names (i.e.,
%    \texttt{lcyenc.def} instead of \texttt{LCYenc.def}) when we do that.
%
%    \begin{macrocode}
\ifdefined\cyrillicencoding
\else
    \if@ukr@uni@ode
        \ifdefined\XeTeXrevision
            \edef\cyrillicencoding{EU1}
        \else
            \ifdefined\luatexversion
                \edef\cyrillicencoding{EU2}
            \fi
        \fi
    \else
        \edef\cyrillicencoding{T2A}
    \fi
    \PackageWarning{babel}%
        {No Cyrillic font encoding has been loaded so far.\MessageBreak
         A font encoding should be declared before babel.\MessageBreak
         Default `\cyrillicencoding' encoding will be loaded
    }%
    \lowercase\expandafter{\expandafter\input\cyrillicencoding enc.def\relax}%
%    \end{macrocode}
%    As final wisdom, we repeat |\@setcyrillicencoding| at |\begin{document}|
%    time. We could not avoid previous call to |\@setcyrillicencoding| since
%    compiler scan \file{.aux} file before it executes delayed code, and
%    \file{.aux} may contain |\set@language{ukrainian}|; the latter rises an
%    error if |\cyrillicencoding| would not be defined by that time.
%    \begin{macrocode}
    \AtBeginDocument{\@setcyrillicencoding}
\fi
%    \end{macrocode}
%
% \Describe\Ukrainian{}
% \DescribeOther\cyr{}
% \DescribeOther\cyrillictext{}
% For the sake of backward compatibility we keep the macro |\Ukrainian|
% but redefine its meaning; now  |\Ukrainian| is simply an alias for
% |\selectlanguage{ukrainian}|.
%
% We define |\cyrillictext| and its alias |\cyr| but remove another alias
% |\Ukr|; these macros are intended for use within \texttt{babel} macros and
% do not perform complete switch of the language.
% In particular, they to do no switch captions and the name of current
% language stored in the macro |\languagename|. This inconsistency might
% break some assumptions embedded into \babel's.
% For example, the |\iflanguage| macro will fail.
%
% Second, |\cyrillictext| does
% not activate shorthands, so that |"<|, |">|, |"`|, |"'|,
% |"---|, e.t.c. will not work.
%
% And third, |\cyrillictext| does not write its trace
% to \file{.aux} file, which might result in wrong typesetting of
% table of content, list of table and list of figures in multilingual
% documents.
%
% Due to any of these reasons the use of the declaration |\cyrillictext| and
% its aliases in ordinary text is strongly discouraged. Instead of the
% declaration |\cyrillictext| it is recommended to use |\Ukrainian| or the
% command |\foreignlanguage| defined in the \babel{} core; their
% functionality is similar to |\selectlanguage{ukrainian}| but they did not
% switch caption names, dates and shorthands.
%
%    \begin{macrocode}
\DeclareRobustCommand{\Ukrainian}{\selectlanguage{\ukrainian}}
\DeclareRobustCommand{\cyrillictext}{%
    \fontencoding\cyrillicencoding\selectfont
    \let\encodingdefault\cyrillicencoding
    \expandafter\set@hyphenmins\ukrainianhyphenmins
    \language\l@ukrainian}%
\let\cyr\cyrillictext
%    \end{macrocode}
%
% \textsc{Next part of code should be moved to \texttt{X2enc.def},
% \texttt{X2enc.dfu}, if needed.}
% Since the \texttt{X2} encoding does not contain Latin letters, we
% should make some redefinitions of \LaTeX\ macros which implicitly
% produce Latin letters.
%
% Unfortunately, the commands |\AA| and |\aa| are not encoding dependent
% in \LaTeX\ (unlike e.g., |\oe| or |\DH|). They are defined as |\r{A}| and
% |\r{a}|. This leads to unpredictable results when the font encoding
% does not contain the Latin letters `A' and `a' (like \texttt{X2}).
%
%    \begin{macrocode}
\expandafter\ifx\csname T@X2\endcsname\relax\else
    \DeclareTextSymbolDefault{\AA}{OT1}
    \DeclareTextSymbolDefault{\aa}{OT1}
    \DeclareTextCommand{\aa}{OT1}{\r a}
    \DeclareTextCommand{\AA}{OT1}{\r A}
\fi
%    \end{macrocode}
%
%
% The macro |\cyrillictext| switches current (e.g., Latin) font encoding
% to a Cyrillic font encoding stored in |\cyrillicencoding|. The macro
% |\latintext| switches back. This method assumes that an font
% encoding is a Latin one. But in fact the latter assumption does not matter
% if any other language is switched on using same method, i.e.
% if corresponding \file{.ldf} file defines required macros to switch that
% language on from same standard (Latin) state.
% Since |\latintext| is defined by the core of babel we do not repeat its
% definition here.
%
%    \begin{macrocode}
%\DeclareRobustCommand{\latintext}{%
%    \fontencoding{\latinencoding}\selectfont
%    \def\encodingdefault{\latinencoding}}
%\let\lat\latintext
%    \end{macrocode}
%
%\Describe\textcyrillic{\marg{text}}
% The macros |\cyrillictext|  and |\latintext| are declarations.
% For shorter chunks of text the commands |\textcyrillic| and |\textlatin|
% can be used.
%
% The macro |\textcyrillic| takes an argument which is then typeset using the
% requested font encoding. It is thus an equivalent or
% |\foreignlanguage{ukrainian}|.
%
%    \begin{macrocode}
\DeclareTextFontCommand{\textcyrillic}{\cyrillictext}
%    \end{macrocode}
%
%
% \subsection{Input encoding}
%
% User should use the \pkg{inputenc} package when any 8-bit Cyrillic
% font encoding is used, selecting one of the Cyrillic input encodings.
% We do not assume any default input encoding, so
% the \pkg{inputenc} package should be  explicitly called by
% |\usepackage{inputenc}| \emph{before} \babel.
% Note however that default font encoding \texttt{T2A} fits
% well enough to Ukrainian version of Windows ANSI encoding which is almost
% equivalent to \texttt{cp1251}.
%
% \changes{1.4e}{2020/10/14}{Removed check if inputenc is loaded}
%
%
%    \subsection{Shorthands}
%
% The double quote  character \texttt{"} is declared to be active in
% Ukrainian language.
%
%    \begin{macrocode}
\initiate@active@char{"}
%    \end{macrocode}
%
% Initial activation state will set to on later in section \ref{sss:extra}.
%
% \Describe\dq{}
% The active character |"| is used as indicated in
% table~\ref{tab:ukrainian-quote}. We save the original double quote
% character in the |\dq| macro to keep it available.
% The math accent |\"| can now be typed as `|"|'.
%
%    \begin{macrocode}
\begingroup \catcode`\"12
\def\reserved@a{\endgroup
    \def\@SS{\mathchar"7019 }
    \def\dq{"}}
\reserved@a
%    \end{macrocode}
%
% \subsubsection{Quotes}
%
% We set |"`| and |"'| as shorthands for |\quotedblbase| and
% |\textquotedblleft|, respectively. These shorthands
% were defined through german quotes |\glqq| and |\grqq|, which in their turn
% are defined in \pkg{babel.def} via |\quotedblbase| and |\textquotedblleft|,
% respectively. It occurred, that old definition caused errors in Unicode
% mode if \pkg{fontspec} is loaded.
%
% The shorthands |"<| and |">| were
% declared to be equivalents for the French quotes |\flqq| and |\frqq|,
% respectively. They are defined in \pkg{babel.def} via |\guillemotleft| and
% |\guillemotrigh|. However, |\flqq| and |\guillemotleft| (and their right
% counterparts) are typeset differently if current encoding is not
% \texttt{T1}. Therefore, we define |"<| and |">|  directly
% through |\guillemotleft| and |\guillemotrigh|.
%
%    \begin{macrocode}
\declare@shorthand{ukrainian}{"`}{\quotedblbase}
\declare@shorthand{ukrainian}{"'}{\textquotedblleft}
\declare@shorthand{ukrainian}{"<}{\guillemotleft}
\declare@shorthand{ukrainian}{">}{\guillemotright}
%    \end{macrocode}
%
% Next set of shorthands is intended for variations of standard macro |\-|
% which indicates explicitly breakpoint for hyphenation in a word. Meaning
% of these shorthands is explained in table~\ref{tab:ukrainian-quote}.
%
%  Because of pdfstrings patches for ukrainian shorthands were removed from |hyperref|,
%  the support for them was added to the |ukraineb.ldf| file.
%
%    \begin{macrocode}
\providecommand\texorpdfstring[2]{#1}
\declare@shorthand{ukrainian}{""}{\hskip\z@skip}
\declare@shorthand{ukrainian}{"~}{%
      \texorpdfstring{\textormath{\leavevmode\hbox{-}}{-}}{-}}
\declare@shorthand{ukrainian}{"=}{\nobreak-\hskip\z@skip}
\declare@shorthand{ukrainian}{"|}{%
    \texorpdfstring{\textormath{\nobreak\discretionary{-}{}{\kern.03em}\allowhyphens}{}}{}}
%    \end{macrocode}
%
% \subsubsection{Emdash, endash and hyphenation sign}
%
% To distinguish between |"-| and |"---| we must check whether the next
% after |-| token is a hyphen character.
% If it is, we output an emdash, otherwise a hyphen sign. Therefor
% \TeX\ looks for the next token after the first `|-|', writes
% its meaning to |\ukrainian@sh@next| and finally call for |\ukrainian@sh@tmp|.
%
%    \begin{macrocode}
\declare@shorthand{ukrainian}{"-}{%
    \def\ukrainian@sh@tmp{%
        \if\ukrainian@sh@next-\expandafter\ukrainian@sh@emdash
        \else%
            \expandafter\ukrainian@sh@hyphen%
        \fi}%
   \futurelet\ukrainian@sh@next\ukrainian@sh@tmp}
%    \end{macrocode}
% Two macros |\ukrainian@sh@hyphen| and |\ukrainian@sh@emdash| called by
% |\ukrainian@sh@tmp|  are defined below. The second of
% them has two parameters since it must gobble next two hyphen signs.
%    \begin{macrocode}
\def\ukrainian@sh@hyphen{\nobreak\-\bbl@allowhyphens}
\def\ukrainian@sh@emdash#1#2{\cdash-#1#2}
%    \end{macrocode}
%
% \Describe\cdash{}
% In its turn, |\ukrainian@sh@emdash| simply calls for |\cdash| which has
% rich use. It analyses 3rd of 3 characters and calls for one of few
% predefined macros |\@Acdash|, |\@Bcdash|, |\@Ccdash|.
%    \begin{macrocode}
\def\cdash#1#2#3{\def\tempx@{#3}%
    \def\tempa@{-}\def\tempb@{~}\def\tempc@{*}%
    \ifx\tempx@\tempa@\@Acdash%
    \else%
        \ifx\tempx@\tempb@\@Bcdash%
        \else%
            \ifx\tempx@\tempc@\@Ccdash%
            \else%
                \errmessage{Wrong usage of cdash}
            \fi
        \fi
    \fi
}
%    \end{macrocode}
%
% All these 3 internal macros call for |\cyrdash|, which type Cyrillic
% emdash, but put different spaces around the dash.
%
% |\@Acdash| is invoked by |"---|. It types Cyrillic emdash to be used
% inside a text and puts an unbreakable thin space before the dash if a
% \textit{space} is placed before |"---| in the source file;
% can be used after display maths formulae, formatted lists, enumerations, etc.
%    \begin{macrocode}
\def\@Acdash{\ifdim\lastskip>\z@\unskip\nobreak\hskip.2em\fi
    \cyrdash\hskip.2em\ignorespaces}%
%    \end{macrocode}
%
% |\@Bcdash| is invoked by |"--~|. It types Cyrillic emdash in compound
% names (like Mendeleev--Klapeiron); requires no space characters around and
% adds extra space after the dash.
%    \begin{macrocode}
\def\@Bcdash{\leavevmode\ifdim\lastskip>\z@\unskip\fi
    \nobreak\cyrdash\penalty\exhyphenpenalty\hskip\z@skip\ignorespaces}%
%    \end{macrocode}
%
% |\@Ccdash| is invoked by |"--*|. It denotes direct speech and adds small
% space after the dash.
%    \begin{macrocode}
\def\@Ccdash{\leavevmode
    \nobreak\cyrdash\nobreak\hskip.35em\ignorespaces}%
%    \end{macrocode}
%
% \Describe\cyrdash{}
%   The |\cyrdash| macro is defined in Cyrillic font encodings (LCY, T2*, OT2,
%   and |X2|) by means of |\DeclareTextSymbol|. In T2* encodings |\cyrdash|
%   refers to same code point 22 as |\textemdash| does so that these two macros
%   are equivalent. However the dash at the code point 22 have different length
%   in different fonts. The dash in Cyrillic fonts LH is 20\% shorter as
%   compared to Latin fonts such as CM (Computer Modern).  As a result, the dash
%   typed by the ligature |---| or its variations mentioned in Table
%   \ref{tab:ukrainian-quote} might change its length after |\selectlanguage|.
%
%   The |\cyrdash| macro is not available in Latin encodings such as T1. Therefor
%   an explicit or implicit call for |\cyrdash| when current language is English
%   causes an error. For such a case, we provide a fake default. A standard check
%   such as |\ifx\cyrdash\undefined ...\fi| fails to detect absent definitions
%   for Latin  encodings since the |\cyrdash| macro is in fact defined. Therefor
%    we use the |\ProvideTextCommandDefault| method:
% \changes{1.4b}{2017/08/10}{Default for \cs{cyrdash} is provided}
%    \begin{macrocode}
\PackageInfo{babel}{Default for \string\cyrdash\space is provided}
%%\ProvideTextCommandDefault{\cyrdash}{\iflanguage{ukrainian}%
%%  {\hbox to.8em{--\hss--}}{\textemdash}}
\ProvideTextCommandDefault{\cyrdash}{\hbox to.8em{--\hss--}}
%    \end{macrocode}%
%
%    The |\cyrdash| macro is not defined in the Unicode encoding TU. The fake
%    definition given above cope with this case.
%
% Finally, we define a shorthand thin space to be placed between initials
% as in |D.",Mendeleev|. When used instead of |\,| as in |D.\,Mendeleev|
% it allows hyphenation in the next word.
%
%    \begin{macrocode}
\declare@shorthand{ukrainian}{",}{\nobreak\hskip.2em\ignorespaces}
%    \end{macrocode}
%
%
% \subsection{Switching to and from Ukrainian}
%
% Now we define additional macros used to reset current language to
% Ukrainian and back
% to some original state. The package \babel{} based on the assumption
% that original state is characterized by a Latin encoding. Previously,
% for back reset the macro |\OriginalTeX| was used, but now use |\latintext|
% for the same purpose.
%
%
% \subsubsection{Caption names}
%
% First, we define Ukrainian equivalents for Ukrainian caption names.
%
% \Describe\captionsukrainian{}
% The macro |\captionsukrainian| defines caption names used in the
% four standard document classes provided with \LaTeX. The macro |\cyr|
% activates Cyrillic encoding. It could be dropped if we would be sure
% that Ukrainian captions are called only if current language is Ukrainian.
% However, the macros such as |\Ukrainian| do not conform to strict rules
% of the package \babel{} as explained in the above.
%
% We now use \babel{}'s  3.9 |\Set<macro>| macro for defining caption names as well
% as date. If Unicode engine is running, Cyrillic letters are typed
% in by their Unicode code-points.
%
%    \begin{macrocode}
%
% ------------------------- Caption Names (Unicode case) -------------------------------
%
\if@ukr@uni@ode
    \PackageInfo{ukraineb.ldf}{Executing babel 3.9 or later}
    \StartBabelCommands*{ukrainian}{captions}[unicode, fontenc=TU EU1 EU2, charset=utf8]
        \SetString\prefacename{Вступ}%                [babel]
        \SetString\refname{Література}%               [only article]
        \SetString\abstractname{Анотація}%            [only article, report]
        \SetString\bibname{Бібліоґрафія}%             [only book, report]
        \SetString\chaptername{Розділ}%               [only book, report]
        \SetString\appendixname{Додаток}%
        \SetString\contentsname{Зміст}%
        \SetString\tocname{\contentsname}%
        \SetString\listfigurename{Перелік ілюстрацій}%
        \SetString\listtablename{Перелік таблиць}%
        \SetString\indexname{Предметний покажчик}%
        \SetString\authorname{Іменний покажчик}%
        \SetString\figurename{Рис.}%
        \SetString\tablename{Таблиця}%
        \SetString\partname{Частина}%
        \SetString\enclname{вкл.}%
        \SetString\ccname{копія}%
        \SetString\headtoname{вх.}%
        \SetString\pagename{с.}%                      [letter]
        \SetString\seename{див.}%
        \SetString\alsoname{див.\ також}%
        \SetString\proofname{Доведення}%              [amsthm]
        \SetString\glossaryname{Словник термінів}%
        \SetString\acronymname{Абревіатури}%          [glossaries] {Acronyms}
        \SetString\lstlistingname{Лістинг}%           [listings]  (the environment) {Listing}
        \SetString\lstlistlistingname{Перелік лістингів}%  [listings]  (the "List of") {Listings}
        \SetString\nomname{Позначення}%
        \SetString\notesname{Нотатки}%                [endnotes] {Notes}
        \SetString\algorithmname{Алгоритм}%           [algorithm2e]
        \SetString\hypothesisname{Гіпотеза}%          [amsthm-like]
        \SetString\theoremname{Теорема}%              [amsthm-like]
%    \end{macrocode}
%    Additional definitions for the package \pkg{nomencl}:
%    \begin{macrocode}
%
% ----------------------------- nomencl (Unicode case) ---------------------------------
%
    \ifdefined\nomname%
        \addto\captionsukrainian{%
            \def\eqdeclaration#1{, див.\nobreakspace(#1)}%
            \def\pagedeclaration#1{, стор.\nobreakspace#1}%
        }%
    \fi
    \EndBabelCommands
\else
%
% ------------------------- Caption Names (Nonunicode case) ----------------------------
%
    \StartBabelCommands*{ukrainian}{captions}
        \SetString\prefacename{{\cyr\CYRV\cyrs\cyrt\cyru\cyrp}}%
        \SetString\refname{%
          {\cyr\CYRL\cyrii\cyrt\cyre\cyrr\cyra\cyrt\cyru\cyrr\cyra}}%
        \SetString\abstractname{%
          {\cyr\CYRA\cyrn\cyro\cyrt\cyra\cyrc\cyrii\cyrya}}%
        \SetString\bibname{%
          {\cyr\CYRB\cyrii\cyrb\cyrl\cyrii\cyro\cyrgup\cyrr\cyra\cyrf\cyrii\cyrya}}%
        \SetString\chaptername{{\cyr\CYRR\cyro\cyrz\cyrd\cyrii\cyrl}}%
        \SetString\appendixname{{\cyr\CYRD\cyro\cyrd\cyra\cyrt\cyro\cyrk}}%
        \SetString\contentsname{{\cyr\CYRZ\cyrm\cyrii\cyrs\cyrt}}%
        \SetString\tocname{\contentsname}%
        \SetString\listfigurename{{\cyr\CYRP\cyre\cyrr\cyre\cyrl\cyrii\cyrk
             \ \cyrii\cyrl\cyryu\cyrs\cyrt\cyrr\cyra\cyrc\cyrii\cyrishrt}}%
        \SetString\listtablename{{\cyr\CYRP\cyre\cyrr\cyre\cyrl\cyrii\cyrk
             \ \cyrt\cyra\cyrb\cyrl\cyri\cyrc\cyrsftsn}}%
        \SetString\indexname{{\cyr\CYRP\cyrr\cyre\cyrd\cyrm\cyre\cyrt\cyrn\cyri\cyrishrt
                \ \cyrp\cyro\cyrk\cyra\cyrzh\cyrch\cyri\cyrk}}%
        \SetString\authorname{{\cyr\CYRII\cyrm\cyre\cyrn\cyrn\cyri\cyrishrt
             \ \cyrp\cyro\cyrk\cyra\cyrzh\cyrch\cyri\cyrk}}%
        \SetString\figurename{{\cyr\CYRR\cyri\cyrs.}}%
        \SetString\tablename{{\cyr\CYRT\cyra\cyrb\cyrl\cyri\cyrc\cyrya}}%
        \SetString\partname{{\cyr\CYRCH\cyra\cyrs\cyrt\cyri\cyrn\cyra}}%
        \SetString\enclname{{\cyr\cyrv\cyrk\cyrl.}}%
        \SetString\ccname{{\cyr\cyrk\cyro\cyrp\cyrii\cyrya}}%
        \SetString\headtoname{{\cyr\cyrv\cyrh.}}%
        \SetString\pagename{{\cyr\cyrs.}}%
        \SetString\seename{{\cyr\cyrd\cyri\cyrv.}}%
        \SetString\alsoname{{\cyr\cyrd\cyri\cyrv.\ \cyrt\cyra\cyrk\cyro\cyrzh}}%
        \SetString\proofname{{\cyr\CYRD\cyro\cyrv\cyre\cyrd\cyre\cyrn\cyrn\cyrya}}%
        \SetString\glossaryname{{\cyr\CYRS\cyrl\cyro\cyrv\cyrn\cyri\cyrk
             \ \cyrt\cyre\cyrr\cyrm\cyrii\cyrn\cyrii\cyrv}}%
        \SetString\acronymname{\cyr\CYRA\cyrb\cyrr\cyre\cyrv\cyrii\cyra\cyrt\cyru\cyri\cyri}%
        \SetString\lstlistingname{\cyr\CYRL\cyrii\cyrs\cyrt\cyri\cyrn\cyrg}%
        \SetString\lstlistlistingname{{\cyr\CYRP\cyre\cyrr\cyre\cyrl\cyrii\cyrk
             \ \cyrl\cyrii\cyrs\cyrt\cyri\cyrn\cyrg\cyrii\cyrv}}%
        \SetString\nomname{{\cyr\CYRP\cyro\cyrz\cyrn\cyra\cyrch\cyre\cyrn\cyrn\cyrya}}%
        \SetString\notesname{{\cyr\CYRN\cyro\cyrt\cyra\cyrt\cyrk\cyri}}%
        \SetString\algorithmname{{\cyr\CYRA\cyrl\cyrg\cyro\cyrr\cyri\cyrt\cyrm}}%
        \SetString\hypothesisname{{\cyr\CYRG\cyrii\cyrp\cyro\cyrt\cyre\cyrz\cyra}}%
        \SetString\theoremname{{\cyr\CYRT\cyre\cyro\cyrr\cyre\cyrm\cyra}}%
%
% ----------------------------- nomencl (Nonunicode case) ------------------------------
%
    \ifdefined\nomname%
        \addto\captionsukrainian{%
            \def\eqdeclaration#1{, {\cyr\cyrd\cyri\cyrv}.\nobreakspace(#1)}%
            \def\pagedeclaration#1{, {\cyr\cyrs\cyrt\cyro\cyrr}.\nobreakspace#1}%
        }%
    \fi
    \EndBabelCommands
\fi
%    \end{macrocode}
%
% \subsubsection{Date in Ukrainian}
%
% \Describe\dateukrainian{}
% The macro |\dateukrainian| is used to reset the macro |\today| in Ukrainian.
%
%    \begin{macrocode}
%
% ---------------------------- Date (Unicode case) -------------------------------------
%
\if@ukr@uni@ode
    \PackageInfo{ukraineb.ldf}{Executing the post 3.9 branch for dates}
    \StartBabelCommands*{ukrainian}{date}[unicode, fontenc=TU EU1 EU2, charset=utf8]
        \SetStringLoop{month#1name}{%
            січня,%
            лютого,%
            березня,%
            квітня,%
            травня,%
            червня,%
            липня,%
            серпня,%
            вересня,%
            жовтня,%
            листопада,%
            грудня%
            }
        \SetString\abbgyear{р.}%
\else
%
% ---------------------------- Date (Nonunicode case) ----------------------------------
%
    \StartBabelCommands*{ukrainian}{date}
        \SetStringLoop{month#1name}{%
           \cyrs\cyrii\cyrch\cyrn\cyrya,%
           \cyrl\cyryu\cyrt\cyro\cyrg\cyro,%
           \cyrb\cyre\cyrr\cyre\cyrz\cyrn\cyrya,%
           \cyrk\cyrv\cyrii\cyrt\cyrn\cyrya,%
           \cyrt\cyrr\cyra\cyrv\cyrn\cyrya,%
           \cyrch\cyre\cyrr\cyrv\cyrn\cyrya,%
           \cyrl\cyri\cyrp\cyrn\cyrya,%
           \cyrs\cyre\cyrr\cyrp\cyrn\cyrya,%
           \cyrv\cyre\cyrr\cyre\cyrs\cyrn\cyrya,%
           \cyrzh\cyro\cyrv\cyrt\cyrn\cyrya,%
           \cyrl\cyri\cyrs\cyrt\cyro\cyrp\cyra\cyrd\cyra,%
           \cyrg\cyrr\cyru\cyrd\cyrn\cyrya%
           }%
        \SetString\abbgyear{\cyrr.}%
\fi
%    \end{macrocode}
% Typesetting date in both unicode and nonunicode cases
%    \begin{macrocode}
%
% ---------------------------- Date typesetting ----------------------------------------
%
\SetString\today{\number\day~\csname month\romannumeral\month name\endcsname\space
    \number\year~\abbgyear}%
\EndBabelCommands
%    \end{macrocode}
%
% \subsubsection{Hyphenation patterns}
%
% Ukrainian hyphenation patterns are automatically activated every time
% Ukrainian language is selected via |\selectlanguage|, |\foreignlanguage|
% or equivalent command. But we need to declare values of
% |\lefthyphenmin| and |\righthyphenmin|; both are set to~2.
%
%
%    \begin{macrocode}
\providehyphenmins{\CurrentOption}{\tw@\tw@}
\providehyphenmins{ukrainian}{\tw@\tw@}
%    \end{macrocode}
%
% \subsubsection{Extra definitions}\label{sss:extra}
%
% \Describe\extrasukrainian{}
% \DescribeOther\noextrasukrainian{}
% The macro |\extrasukrainian| performs extra definitions in addition to
% resetting the caption names and date.
% The macro |\noextrasukrainian| is used to cancel the actions of
% |\extrasukrainian|.
%
%
% First, we instruct \babel{} to switch font encoding using earlier
% defined macros |\cyrillictext| and |\latintext|.
%
%    \begin{macrocode}
\addto\extrasukrainian{\cyrillictext}
\addto\noextrasukrainian{\latintext}
%    \end{macrocode}
%
% Second, we specify that the Ukrainian group of shorthands should be used.
%
%    \begin{macrocode}
\addto\extrasukrainian{\languageshorthands{ukrainian}}
\addto\extrasukrainian{\bbl@activate{"}}
\addto\noextrasukrainian{\bbl@deactivate{"}}
%    \end{macrocode}
%
% Now the action |\extrasukrainian| has to execute is to make sure that the
% command |\frenchspacing| is in effect. If this is not the case the
% execution of |\noextrasukrainian| will switch it off again.
%
%    \begin{macrocode}
\addto\extrasukrainian{\bbl@frenchspacing}
\addto\noextrasukrainian{\bbl@nonfrenchspacing}
%    \end{macrocode}
%
% \subsection{Alphabetic enumerations}
%
% The traditional alphabetical enumerations in Ukrainian texts use the
% Cyrillic alphabet (bar several letters). In principle, enumerations are
% a matter for class and style designers but the same can be said also
% about things, other than enumerations, such as names of sections and
% bibliography lists.
%
% The alphabet is not the only difference, differences also in the labels format.
% According to Cyrillic typesetting tradition and also with ДСТУ 3008:2015,
% label format should be with one right parenthesis and the top level enumerate should be
% alphabetical, but we believe that this is not necessary
% for including such changes  in \file{\jobname.ldf}, for this purpose you can simply redefine
% required counters in preamble by common \LaTeX way.
%
% \begin{verbatim}
%     \def\theenumi{\alph{enumi}}
%     \def\labelenumi{\theenumi)}
%     \def\theenumii{\alph{enumii}}
%     \def\labelenumii{\theenumii)}
% \end{verbatim}

%
% Nevertheless, the Ukrainian \babel{} by default turns on alphabetical enumeration
% with Cyrillic letters. This means that enumerated lists that would be labelled with
% Latin letters in Latin scripts are labelled with Cyrillic ones instead.
%
% \Describe\Alph{}
% Starting from this virsion, we remove an macro |\Asbuk|
% (also it lowercase counterpart |\asbuk|). Now we redefine the macro |\Alph|,
% which is now produces (uppercase) Cyrillic letters instead of Latin ones
% when Ukrainian is switched on.
%
% The letters Ґ, Є, З, І, Ї, Й, О, Ч, Ь, are skipped for such enumeration (see \href{http://www.uintei.kiev.ua/readarticle.php?article_id=151}{ДСТУ 3008:2015}).
%
%    \begin{macrocode}
\addto\extrasukrainian{%
%    \end{macrocode}
% When Ukrainian swithsed off, the previous meaning of |\@Alph| will be restored
%    \begin{macrocode}
    \babel@save{\@Alph}%
     \if@ukr@uni@ode%
         \def\@Alph#1{%
             \ifcase#1\or%
                 А\or Б\or В\or Г\or Д\or Е\or Ж\or%
                 И\or К\or Л\or М\or Н\or П\or Р\or%
                 С\or Т\or У\or Ф\or Х\or Ц\or Ш\or%
                 Щ\or Ю\or Я%
             \else%
                 \@ctrerr%
             \fi}%
     \else
         \def\@Alph#1{%
              \ifcase#1\or%
                 \CYRA\or\CYRB\or\CYRV\or\CYRG\or\CYRD\or\CYRE\or\CYRZH\or%
                 \CYRI\or\CYRK\or\CYRL\or\CYRM\or\CYRN\or\CYRP\or\CYRR\or%
                 \CYRS\or\CYRT\or\CYRU\or\CYRF\or\CYRH\or\CYRC\or\CYRSH\or%
                 \CYRSHCH\or\CYRYU\or\CYRYA%
              \else%
                  \@ctrerr%
              \fi}%
     \fi
}
%    \end{macrocode}
%  \Describe\alph{}
% Now the macro |\alph| produces lowercase Cyrillic letters.
%
% The lowercase letters ґ, є, з, і, ї, й, о, ч, ь, are also skipped such enumeration (see \href{http://www.uintei.kiev.ua/readarticle.php?article_id=151}{ДСТУ 3008:2015}).
%    \begin{macrocode}
\addto\extrasukrainian{%
%    \end{macrocode}
%    When Ukrainian swithsed off, the previous meaning of |\@alph| will be restored
%    \begin{macrocode}
    \babel@save{\@alph}%
    \if@ukr@uni@ode%
        \def\@alph#1{%
            \ifcase#1\or%
                 а\or б\or в\or г\or д\or е\or ж\or%
                 и\or к\or л\or м\or н\or п\or р\or%
                 с\or т\or у\or ф\or х\or ц\or ш\or%
                 щ\or ю\or я%
            \else%
                \@ctrerr%
            \fi}%
    \else
        \def\@alph#1{%
             \ifcase#1\or%
                 \cyra\or\cyrb\or\cyrv\or\cyrg\or\cyrd\or\cyre\or\cyrzh\or%
                 \cyri\or\cyrk\or\cyrl\or\cyrm\or\cyrn\or\cyrp\or\cyrr\or%
                 \cyrs\or\cyrt\or\cyru\or\cyrf\or\cyrh\or\cyrc\or\cyrsh\or%
                 \cyrshch\or\cyryu\or\cyrya%
            \else%
                \@ctrerr%
            \fi}%
    \fi
}
%    \end{macrocode}
%
% \subsection{Ukrainian mathematical typography traditions}
%
% \Describe\sh{}%
% \DescribeOther\ch{}%
% \DescribeOther\tg{}%
% \DescribeOther\ctg{}%
% \DescribeOther\arctg{}%
% \DescribeOther\arcctg{}%
% \DescribeOther\th{}%
% \DescribeOther\cth{}%
% \DescribeOther\cosec{}%
% We also define few math operator names according to Ukrainian mathematical
% typography traditions. Some math functions in Ukrainian math books have names
% different from English writings. For example, \texttt{sinh} in
% Ukrainian is called \texttt{sh}. Special consideration needs the
% macro |\th| that conflicts with the text symbol |\th|
% defined in Latin~1 encoding:
%
%    \begin{macrocode}
\AtBeginDocument{%
  \@ifpackagewith{babel}{russian}{\relax}{%
      \@ifpackageloaded{amsopn}
      {%
        \DeclareMathOperator{\sh}{sh}%
        \DeclareMathOperator{\ch}{ch}%
        \DeclareMathOperator{\tg}{tg}%
        \DeclareMathOperator{\ctg}{ctg}%
        \DeclareMathOperator{\arctg}{arctg}%
        \DeclareMathOperator{\arcctg}{arcctg}%
        \DeclareMathOperator{\cth}{cth}%\
        \DeclareMathOperator{\cosec}{cosec}%
        \DeclareMathOperator{\math@th}{th}%
      }{%
        \DeclareRobustCommand\sh{\mathop{\operator@font sh}\nolimits}%
        \DeclareRobustCommand\ch{\mathop{\operator@font ch}\nolimits}%
        \DeclareRobustCommand\tg{\mathop{\operator@font tg}\nolimits}%
        \DeclareRobustCommand\ctg{\mathop{\operator@font ctg}\nolimits}%
        \DeclareRobustCommand{\arctg}{\mathop{\operator@font arctg}\nolimits}%
        \DeclareRobustCommand\arcctg{\mathop{\operator@font arcctg}\nolimits}%
        \DeclareRobustCommand\cth{\mathop{\operator@font cth}\nolimits}%\MakeRobust\cth%
        \DeclareRobustCommand\cosec{\mathop{\operator@font cosec}\nolimits}%
        \DeclareRobustCommand{\math@th}{\mathop{\operator@font th}\nolimits}%
      }%
      \let\text@th\th%
      \DeclareRobustCommand{\th}{\TextOrMath{\text@th}{\math@th}}%
    }%
}
%    \end{macrocode}
%
% For compatibility with older Ukrainian packages we leave definition of the |\No|
% macro. However the Ukrainian number sign is now superseded with |\textnumero|.
% Moreover, it can be found on the keyboard.
%    \begin{macrocode}
\DeclareRobustCommand{\No}{%
    \ifmmode{\nfss@text{\textnumero}}\else\textnumero\fi}
%    \end{macrocode}
%
% \subsection{Final settings}
%
% The macro |\ldf@finish| does work needed
% at the end of each \file{.ldf} file. This
% includes resetting the category code of the \texttt{@}-sign,
% loading a local configuration file, and preparing the language
% to be activated at |\begin{document}| time.
%
%    \begin{macrocode}
\ldf@finish{ukrainian}
%    \end{macrocode}
%
%
%\iffalse
%</code>
%\fi
% \CheckSum{1151}
%\Finale
%
%%
%% \CharacterTable
%%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%%   Digits        \0\1\2\3\4\5\6\7\8\9
%%   Exclamation   \!     Double quote \"    Hash (number) \#
%%   Dollar        \$     Percent      \%    Ampersand     \&
%%   Acute accent  \'     Left paren   \(    Right paren   \)
%%   Asterisk      \*     Plus         \+    Comma         \,
%%   Minus         \-     Point        \.    Solidus       \/
%%   Colon         \:     Semicolon    \;    Less than     \<
%%   Equals        \=     Greater than \>    Question mark \?
%%   Commercial at \@     Left bracket \[    Backslash     \\
%%   Right bracket \]     Circumflex   \^    Underscore    \_
%%   Grave accent  \`     Left brace   \{    Vertical bar  \|
%%   Right brace   \}     Tilde        \~}
%%
%\endinput

%% Nonunicode Cyrillic Letters
%% \CYRA=А
%% \CYRB=Б
%% \CYRV=В
%% \CYRG=Г
%% \CYRGUP=Ґ
%% \CYRD=Д
%% \CYRE=Е
%% \CYRIE=Є
%% \CYRZH=Ж
%% \CYRZ=З
%% \CYRI=И
%% \CYRII=I
%% \CYRYI=Ї
%% \CYRISHRT=Й
%% \CYRK=К
%% \CYRL=Л
%% \CYRM=М
%% \CYRN=Н
%% \CYRO=О
%% \CYRP=П
%% \CYRR=Р
%% \CYRS=С
%% \CYRT=Т
%% \CYRU=У
%% \CYRF=Ф
%% \CYRH=Х
%% \CYRC=Ц
%% \CYRCH=Ч
%% \CYRSH=Ш
%% \CYRSHCH=Щ
%% \CYRYU=Ю
%% \CYRYA=Я
%% \CYRSFTSN=Ь
%%
%% \cyra=а
%% \cyrb=б
%% \cyrv=в
%% \cyrg=г
%% \cyrgup=ґ
%% \cyrd=д
%% \cyre=е
%% \cyrie=є
%% \cyrzh=ж
%% \cyrz=з
%% \cyri=и
%% \cyrii=i
%% \cyryi=ї
%% \cyrishrt=й
%% \cyrk=к
%% \cyrl=л
%% \cyrm=м
%% \cyrn=н
%% \cyro=о
%% \cyrp=п
%% \cyrr=р
%% \cyrs=с
%% \cyrt=т
%% \cyru=у
%% \cyrf=ф
%% \cyrh=х
%% \cyrc=ц
%% \cyrch=ч
%% \cyrsh=ш
%% \cyrshch=щ
%% \cyryu=ю
%% \cyrya=я
%% \cyrsftsn=ь