% \iffalse meta-comment
% 
% File: linguistix-marathi.dtx
% 
% ----------------------------------------------------------
% The LaTeX bundle LinguisTiX v0.6a
% Copyright © 2022, 2023, 2024, 2025 निरंजन
% 
% This program is free software: you can redistribute it
% and/or modify it under the terms of the GNU General Public
% License as published by the Free Software Foundation,
% either version 3 of the License, or (at your option) any
% later version.
% 
% This program is distributed in the hope that it will be
% useful, but WITHOUT ANY WARRANTY; without even the implied
% warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
% PURPOSE. See the GNU General Public License for more
% details.
% 
% You should have received a copy of the GNU General Public
% License along with this program. If not, see
% <https://www.gnu.org/licenses/>.
% ----------------------------------------------------------
% 
% \fi
% \iffalse
%<*driver>
\documentclass{l3doc}
\usepackage{linguistix}
\usepackage{xcolor}
\usepackage{fontawesome5}
\usepackage[sc]{gfdl}
\usepackage[verbose=silent]{microtype}
\usepackage{cleveref}
\usepackage{hyperxmp}

\makeatletter
\def\@xobeysp{\hphantom{X}}%
\makeatother

\linguistix{old style one}
\loadlanguages{british,marathi}

\setquotestyle{british}

\colorlet{lngxredcolor}{red!50!black}
\colorlet{lngxgreencolor}{green!50!black}
\colorlet{lngxbluecolor}{blue!50!black}

\urlstyle{tt}

\hypersetup{%
  unicode,%
  colorlinks,%
  linkcolor              = {lngxredcolor},
  citecolor              = {lngxgreencolor},
  urlcolor               = {lngxbluecolor},
  pdftitle               = {linguistix-marathi},%
  pdfauthor              = {निरंजन},%
  pdfsubject             = {%
    मराठी (Marathi) with LinguisTiX.%
  },%
  pdfcreator             = {निरंजन},%
  pdfkeywords            = {Linguistics, LaTeX},%
  pdfcopyright           = {%
    The LaTeX bundle linguistix\textLF
    Copyright © 2022, 2023, 2024, 2025 निरंजन\textLF
    Permission is granted to copy, distribute and/or modify
    this document under the terms of the GNU Free
    Documentation License, Version 1.3 or any later version
    published by the Free Software Foundation; with no
    Invariant Sections, no Front-Cover Texts, and no
    Back-Cover Texts. A copy of the license is included in
    the section entitled ‘GNU Free Documentation License’.%
  },%
  pdflicenseurl          = {%
    https://www.gnu.org/licenses/fdl-1.3.txt%
  }%
}%

\gfdlcopyrightholders{%
  \texorpdfstring{%
    {%
      निरंजन%
    } (%
      \href{mailto:hi.niranjan@pm.me}{%
        \ttfamily
        hi.niranjan@pm.me%
      }%
    )%
  }{%
    निरंजन%
  }%
}

\gfdlcopyrightableyears{2022, 2023, 2024, 2025}

\gfdlcopyrightdescription{The \lngxpkg\ bundle}

\colorlet{lngxpurplecolor}{blue!50!red}

\def\lngxtval{%
  \begingroup
  \color{lngxredcolor}
  true%
  \endgroup
  \,|\,false%
}

\def\lngxfval{%
  true%
  \begingroup
  \color{lngxredcolor}
  \,|\,false%
  \endgroup
}

\ExplSyntaxOn
\msg_redirect_name:nnn { l3doc }
                       { foreign-internal }
                       { none }
\ExplSyntaxOff

\begin{document}
\DocInput{\jobname.dtx}
\end{document}
%</driver>
% \fi
% \title{मराठी\,--\,\lngxmarathilogo}
% \author{निरंजन}
% \date{^^A
%   \today\ (v0.6a)\\[1ex]^^A
%   {^^A
%     \small\faIcon{home}\quad
%     \url{^^A
%       https://ctan.org/pkg/linguistix^^A
%     }\\[0.5ex]^^A
%     \small\faIcon{git-alt}\quad
%     \url{^^A
%       https://puszcza.gnu.org.ua/projects/linguistix^^A
%     }\\[0.5ex]^^A
%     \small\faIcon[regular]{comments}\quad
%     \url{^^A
%       https://matrix.to/\#/\#linguistix:matrix.org^^A
%     }^^A
%   }^^A
% }
% 
% \maketitle
% \begin{implementation}
% \noindent I initialise the package with basic information.
%    \begin{macrocode}
%<*marathi>
\ProvidesExplPackage{linguistix-marathi}
                    {2025-12-22}
                    {v0.6a}
                    {मराठी (Marathi)}
%    \end{macrocode}
% Average height of Marathi conjuncts could be more than
% that of Latin letters with descenders. This requires minor
% adjustments in the baseline stretch. To do it uniformly
% for footnotes also, I use the \pkg{setspace} package (if
% not loaded already).
%    \begin{macrocode}

\IfPackageLoadedF { setspace } {
  \RequirePackage { setspace }
}
%    \end{macrocode}
% We need to set the spacing between lines and words for
% which I use internal floating point numbers. They are
% declared here.
%    \begin{macrocode}

\fp_gzero_new:N \g_मराठी_शब्दांतील_अंतर_fp
\fp_gzero_new:N \g_मराठी_ओळींतील_अंतर_fp
%    \end{macrocode}
% This macro grabs an argument and passes it to the key
% |शब्दांतील अंतर| which is used to set the inter-word space
% for Marathi.
%    \begin{macrocode}

\cs_new_protected:Npn \मराठी_शब्दांतील_अंतर:n #1 {
  \lngx_set_keys:n { शब्दांतील~ अंतर = { #1 } }
}

\cs_gset_eq:NN \शब्दांतीलअंतर \मराठी_शब्दांतील_अंतर:n
%    \end{macrocode}
% This macro grabs an argument, (g-)sets it as the value of
% \cs{g_मराठी_ओळींतील_अंतर_fp} and resets the baseline stretch
% with \cs{setstretch} command. If the current class is
% \cls{memoir}, then there is a method to do that without
% any package. I use that.
%    \begin{macrocode}

\cs_new_protected:Npn \मराठी_ओळींतील_अंतर:n #1 {
  \tl_gset:Nn \g_मराठी_ओळींतील_अंतर_tl { #1 }
  \IfClassLoadedTF { memoir } {
    \setSingleSpace {
      \fp_use:N \g_मराठी_ओळींतील_अंतर_fp
    }
    \SingleSpacing
  } {
    \setstretch {
      \fp_use:N \g_मराठी_ओळींतील_अंतर_fp
    }
  }
}

\cs_gset_eq:NN \ओळींतीलअंतर \मराठी_ओळींतील_अंतर:n
%    \end{macrocode}
% Here I define two keys for adjusting the space between
% words and lines respectively. Their defaults are also set
% here.
%    \begin{macrocode}

\keys_define:nn { मराठी } {
  शब्दांतील~ अंतर
  .fp_gset:N             = \g_मराठी_शब्दांतील_अंतर_fp,
  शब्दांतील~ अंतर
  .initial:n             = { 1.25 },
  ओळींतील~ अंतर
  .code:n                = {
    \मराठी_ओळींतील_अंतर:n { #1 }
  }
}
%    \end{macrocode}
% The \pkg{babel} package defines |\extrasxxxx| commands for
% languages where the additional code that should go with a
% particular language (|xxxx| in this case) is set. The
% |\addto| command is used for appending to the same. I
% start with defining additional macros for Marathi.
%    \begin{macrocode}

\addto { \extrasmarathi } {
%    \end{macrocode}
% I have added the command for using the socket for native
% numbering. It will pickup its value from the current
% assignment of the plugs and produce the results
% accordingly.
%    \begin{macrocode}
  \socket_use:n { lngx / native-numbering }
%    \end{macrocode}
% By default, \LaTeX\ prints roman numeral (in capital) as
% part numbers. They are not suitable for Marathi. Thus we
% change them to arabic instead.
%    \begin{macrocode}
  \cs_set:Npn \thepart { \lngx_counter:n { part } }
%    \end{macrocode}
% The default \LaTeX\ produces Latin numerals, roman (small
% and capital both) alphabets and a-z alphabets with
% enumerate at different levels of nesting. In Marathi, both
% are irrelevant. Thus I renew all of the concerned commands
% and change them to print Marathi numbers. Since Marathi
% doesn’t have much variety available for counters, I have
% chosen a simpler style, i.e. 1, 1.1, 1.1.1 and 1.1.1.1.
%    \begin{macrocode}
  \cs_set:Npn \theenumi { \lngx_counter:n { enumi } }
  \cs_set:Npn \theenumii {
    \lngx_counter:n { enumi } .
    \lngx_counter:n { enumii }
  }
%    \end{macrocode}
% A period is added after each ‘label’ in enumerate. In
% default \LaTeX, the label for second level enumeration is
% printed inside brackets. We don’t need it in Marathi. So
% I change the \cs{labelenumii} command and add a period.
% It is not added for the first level because that’s
% \LaTeX-default too. Similarly, this is extended to all the
% other levels.
%    \begin{macrocode}
  \cs_set:Npn \labelenumii { \theenumii . }
  \cs_set:Npn \theenumiii {
    \lngx_counter:n { enumi } .
    \lngx_counter:n { enumii } .
    \lngx_counter:n { enumiii }
  }
  \cs_set:Npn \labelenumiii { \theenumiii . }
  \cs_set:Npn \theenumiv {
    \lngx_counter:n { enumi } .
    \lngx_counter:n { enumii } .
    \lngx_counter:n { enumiii } .
    \lngx_counter:n { enumiv }
  }
  \cs_set:Npn \labelenumiv { \theenumiv . }
%    \end{macrocode}
% The \pkg{expex} package has an independent mechanism of
% defining and using counters. I define a set called
% |देवनागरी| here and make it the default when Marathi is
% used. Note that this change will go with the
% \cs{lngx_misc_reset:} command. Refer to |linguistix.pdf|
% for more information on this.
%    \begin{macrocode}
  \IfPackageLoadedT { expex } {
    \definelabeltype { देेवनागरी } {
      labelgen                 = { list },
      labellist                = {
        अ, आ, इ, ई,
        उ, ऊ, ए, ऐ,
        ओ, औ, अं, अः,
        ॲ, ऋ, ॠ, ऌ, ॡ, ऑ
      },
      labelformat              = {A.},
      fullrefformat            = {XA},
      labelalign               = {left},
      labelwidth               = {1.5em}
    }
    \lingset {
      labeltype                = { देवनागरी }
    }
  }
%    \end{macrocode}
% Marathi doesn’t distinguish between Italic and Upright. So
% I redefine \cs{emph} to produce the argument in bold
% instead. This also goes when \cs{lngx_misc_reset:} is
% used.
%    \begin{macrocode}
  \cs_gset_eq:NN \emph \textbf
}
%    \end{macrocode}
% With the following code, I add the date conversion
% settings and the parameters to |onchar| command inside
% \cs{babelprovide}. This is done only if Marathi is the
% main language of the document. I also set the numbering
% style to |strict|ly native if Marathi is the main
% language.
%    \begin{macrocode}

\tl_if_eq:NnTF \g_lngx_main_language_tl { marathi } {
  \lngx_set_keys:n { native~ numbering = { strict } }
  \babelprovide [
    onchar               = { ids~ fonts },
    date.gregorian /
    date.long            = {
      [d|digits]~ [MMMM],~ [y|digits]
    },
%    \end{macrocode}
% We need numbers in words when in frontmatter. They are
% added in a special counter |आकडे| and used with a hook for
% frontmatter. The settings are reset after mainmatter is
% started.
%    \begin{macrocode}
    counters / आकडे =
    एक~ दोन~ तीन~ चार~ पाच~
    सहा~ सात~ आठ~ नऊ~ दहा~
    अकरा~ बारा~ तेरा~ चौदा~ पंधरा~
    सोळा~ सतरा~ अठरा~ एकोणीस~ वीस~
    एकवीस~ बावीस~ तेवीस~ चोवीस~ पंचवीस~
    सव्वीस~ सत्तावीस~ अठ्ठावीस~ एकोणतीस~ तीस~
    एकतीस~ बत्तीस~ तेहतीस~ चौतीस~ पस्तीस~
    छत्तीस~ सदतीस~ अडतीस~ एकोणचाळीस~ चाळीस~
    एकेचाळीस~ बेचाळीस~ त्रेचाळीस~ चव्वेचाळीस~ पंचेचाळीस~
    शेहेचाळीस~ सत्तेचाळीस~ अठ्ठेचाळीस~ एकोणपन्नास~ पन्नास~
    एकावन्न~ बावन्न~ त्रेपन्न~ चौपन्न~ पंचावन्न~
    छप्पन्न~ सत्तावन्न~ अठ्ठावन्न~ एकोणसाठ~ साठ~
    एकसष्ट~ बासष्ट~ त्रेसष्ट~ चौसष्ट~ पासष्ट~
    सहासष्ट~ सदुष्ट~ अडुसष्ट~ एकोणसत्तर~ सत्तर~
    एकाहत्तर~ बाहत्तर~ त्र्याहत्तर~ चौऱ्याहत्तर~ पंचाहत्तर~
    शाहत्तर~ सत्त्याहत्तर~ अठ्ठ्याहत्तर~ एकोणऐंशी~ ऐंशी~
    एक्याऐंशी~ ब्याऐंशी~ त्र्याऐंशी~ चौऱ्याऐंशी~ पंच्याऐंशी~
    श्याऐंशी~ सत्त्याऐंशी~ अठ्ठ्याऐंशी~ एकोणनव्वद~ नव्वद~
    एक्याण्णव~ ब्याण्णव~ त्र्याण्णव~ चौऱ्याण्णव~ पंचाण्णव~
    शहाण्णव~ सत्त्याण्णव~ अठ्याण्णव~ नव्याण्णव~ शंभर
  ] { marathi }
  \hook_gput_code:nnn { cmd / frontmatter / after } { . } {
    \cs_set:Npn \thepage {
      \localecounter { आकडे } { page }
    }
  }
  \hook_gput_code:nnn { cmd / mainmatter / after } { . } {
    \cs_set:Npn \thepage {
      \marathicounter { page }
    }
  }
%    \end{macrocode}
% The |\arraystretch| command needs to be reset to a larger
% value so that it can incorporate Marathi’s vertical
% conjuncts.
%    \begin{macrocode}
  \cs_set:Npn \arraystretch { 1.2 }
%    \end{macrocode}
% I have used only the bold and light variant of Mukta for
% all the fonts. In sans and mono, the width of the New
% Computer Modern fonts is slightly more, so I use the
% ‘regular’ variant of Mukta there. Otherwise, Mukta-Light
% is a better match for New Computer Modern Book.
%    \begin{macrocode}
  \clist_map_inline:nn {
    upright,
    italic,
    slanted,
    swash
  } {
    \lngx_set_keys:n {
      text~ #1               = { Mukta - Light . ttf   },
      text~ bold~ #1         = { Mukta - Bold . ttf    },
      text~ sans~ #1         = { Mukta - Regular . ttf },
      text~ sans~ bold~ #1   = { Mukta - Bold . ttf    },
      text~ mono~ #1         = { Mukta - Regular . ttf },
      text~ mono~ bold~ #1   = { Mukta - Bold . ttf    }
    }
  }
%    \end{macrocode}
% Using the |text extra features| key, I declare
% \textsc{nfss} families called |देवनागरी_main|,
% |देवनागरी_sans|, |देवनागरी_mono| that will be used
% later. Also, I use the key for interword-spacing here.
%    \begin{macrocode}
  \lngx_set_keys:n {
    text~ extra~
    features                 = {
      NFSSFamily               = { देवनागरी_main },
      WordSpace                = {
        \fp_use:N \g_मराठी_शब्दांतील_अंतर_fp
      }
    },
    text~ sans~ extra~
    features                 = {
      NFSSFamily               = { देवनागरी_sans },
      WordSpace                = {
        \fp_use:N \g_मराठी_शब्दांतील_अंतर_fp
      }
    },
    text~ mono~ extra~
    features                 = {
      NFSSFamily               = { देवनागरी_mono },
      WordSpace                = {
        \fp_use:N \g_मराठी_शब्दांतील_अंतर_fp
      }
    }
  }
} {
%    \end{macrocode}
% In the false branch (i.e., if Marathi is not the main
% language), I use the macros that set the ‘other’
% (non-main) fonts for Marathi. The fonts are the same, but
% the key-value interface is not available, so the code is
% slightly verbose. Before that we load the |onchar| option
% with |ids| and |fonts| options.
%    \begin{macrocode}
  \babelprovide [ onchar     = { ids~ fonts } ] { marathi }
  \lngx_other_main_font:nnn { marathi } {
    WordSpace                = {
      \fp_use:N \g_मराठी_शब्दांतील_अंतर_fp
    },
    NFSSFamily               = { देवनागरी_main },
    UprightFont              = { Mukta - Light . ttf   },
    ItalicFont               = { Mukta - Light . ttf   },
    BoldFont                 = { Mukta - Bold . ttf    },
    BoldItalicFont           = { Mukta - Bold . ttf    },
    SlantedFont              = { Mukta - Light . ttf   },
    BoldSlantedFont          = { Mukta - Bold . ttf    },
    SwashFont                = { Mukta - Light . ttf   },
    BoldSwashFont            = { Mukta - Bold . ttf    },
    SmallCapsFont            = { Mukta - Light . ttf   }
  } { Mukta - Light . ttf }
  \lngx_other_sans_font:nnn { marathi } {
    WordSpace                = {
      \fp_use:N \g_मराठी_शब्दांतील_अंतर_fp
    },
    NFSSFamily               = { देवनागरी_sans },
    UprightFont              = { Mukta - Regular . ttf },
    ItalicFont               = { Mukta - Regular . ttf },
    BoldFont                 = { Mukta - Bold . ttf    },
    BoldItalicFont           = { Mukta - Bold . ttf    },
    SlantedFont              = { Mukta - Regular . ttf },
    BoldSlantedFont          = { Mukta - Bold . ttf    },
    SwashFont                = { Mukta - Regular . ttf },
    BoldSwashFont            = { Mukta - Bold . ttf    },
    SmallCapsFont            = { Mukta - Regular . ttf }
  } { Mukta - Regular . ttf }
  \lngx_other_mono_font:nnn { marathi } {
    WordSpace                = {
      \fp_use:N \g_मराठी_शब्दांतील_अंतर_fp
    },
    NFSSFamily               = { देवनागरी_mono },
    UprightFont              = { Mukta - Regular . ttf },
    ItalicFont               = { Mukta - Regular . ttf },
    BoldFont                 = { Mukta - Bold . ttf    },
    BoldItalicFont           = { Mukta - Bold . ttf    },
    SlantedFont              = { Mukta - Regular . ttf },
    BoldSlantedFont          = { Mukta - Bold . ttf    },
    SwashFont                = { Mukta - Regular . ttf },
    BoldSwashFont            = { Mukta - Bold . ttf    },
    SmallCapsFont            = { Mukta - Regular . ttf }
  } { Mukta - Regular . ttf }
}
%    \end{macrocode}
% In order to allow Devanagari in math mode, I use the
% following code. Since this setting has to be done after
% the initialisation, I use a hook for lazy loading.
%    \begin{macrocode}

\hook_gput_code:nnn { begindocument / end } { . } {
  \DeclareSymbolFont { देवनागरी }
                     { TU }
                     { देवनागरी_main }
                     { m }
                     { n }
  \int_step_inline:nnn { "0900 } { "097F } {
    \Umathcode #1 = "0 ~ \use:c { symदेवनागरी } ~ #1
  }
}
%</marathi>
%    \end{macrocode}
% \end{implementation}
% \selectlanguage{english}
% \Finale
