% \iffalse meta-comment
%
% Copyright (C) 1993-2026
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
% This file is part of the Standard LaTeX `Tools Bundle'.
% -------------------------------------------------------
%
% It may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
% of this license or (at your option) any later version.
% The latest version of this license is in
%    https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
% version 2008 or later.
%
% The list of all files belonging to the LaTeX `Tools Bundle' is
% given in the file `manifest.txt'.
%
% \fi
% \iffalse
%% Package varioref to use with LaTeX2e
%% Copyright (C) 1992-2026  Frank Mittelbach, all rights reserved.
%%
%% For additions or updates to the language options please contact
%% the author at
%%
%%   frank.mittelbach@latex-project.org
%%
%% or open an issue at https://github.com/latex3/latex2e.
%%
%
%<package>\NeedsTeXFormat{LaTeX2e}[1995/05/16]
%<package>
%
% For any rollback before 2019 load the 2016 version and hope for the best:
%<package>\DeclareRelease{}{1994-06-01}{varioref-2016-02-16.sty}
%<package>\DeclareRelease{}{2016-02-16}{varioref-2016-02-16.sty}
%<package>\DeclareRelease{}{2019-10-01}{varioref-2019-10-01.sty}
%<package>\DeclareCurrentRelease{}{2026-06-01}
%<package>
%<package>\ProvidesPackage{varioref}
%<package>    [2026/01/20 v1.6h package for extended references (FMi)]
% \fi
%
%%
%
%
% \changes{v1.0a}{1993/12/06}{Upgrade to LaTeX2e}
% \changes{v1.0g}{1994/05/27}{Use \cmd\DeclareRobustCommand}
% \changes{v1.5c}{2016/02/09}{Revamped some of the documentation to better
%	explain how varioref could be used in a multi-lingual context}
% \changes{v1.6a}{2019/08/25}{\cs{labelformat} and \cs{Ref} now available in the kernel
%       so removed from this package but only in new kernel}
%
%
% \newcommand\NewIn[1]{\marginpar{\fbox{\fbox{\sffamily\tabular{l}New
%    in\\#1\endtabular}}}}
% \newcommand\ChangedIn[1]{\marginpar{\fbox{\fbox{\sffamily\tabular{l}Changed
%    in\\#1\endtabular}}}}
%
% \providecommand\pkg[1]{\texttt{#1}}
% \providecommand\option[1]{\texttt{#1}}
% \providecommand\meta[1]{$\langle§\textit{#1}$\rangle$}
%
%
% \makeatletter
% \def\allowtofu{^^A
%\def\UTFviii@undefined@err##1{^^A
%  \PackageWarning{inputenc}{Unicode character \expandafter
%                          \UTFviii@splitcsname\string##1\relax
%                          \MessageBreak
%                          not set up for use with LaTeX -- ignored}^^A
%  \raisebox{.8pt}{\fboxsep1pt\kern.1pt\fbox{$\cdot$}\kern.1pt}^^A
%   }}
% \makeatother
%
% \title{The \pkg{varioref} package\thanks{This file
%        has version number \fileversion, last
%        revised \filedate.}}
% \author{Frank Mittelbach}
% \date{\filedate}
%
% \MaintainedByLaTeXTeam{tools}
% \maketitle
%
%
% \begin{abstract}
%   This package defines the commands |\vref|, |\vpageref|,
%   |\vrefrange|, and |\vpagerefrange| for
%   \LaTeXe. |\vref| is similar to |\ref| but adds an additional
%   page reference, like `on the facing page' or `on page 27' whenever
%   the corresponding |\label| is not on the same page. The command
%   |\vpageref| is a variation to |\pageref| with a similar
%   functionality.  The |\v...range| commands take two labels as arguments
%   and produce strings which depend on whether or not these labels
%    fall onto a single page or on different pages.
%   Generated strings are customizable so that these
%   commands are usable with various languages.
% \end{abstract}
%
%
% \columnsep=2\columnsep
% \begin{multicols}{2}
%   \tableofcontents
% \end{multicols}
%
% \section{Introduction}
%
% In many cases it is helpful when referring to a figure or table to
% put both a |\ref| and a |\pageref| command into the document
% especially when there are one or more pages between the reference
% and the object.  Therefore some people use a command like
% \begin{verbatim}
%  \newcommand{\fullref}[1]{\ref{#1} on page~\pageref{#1}}
%\end{verbatim}
% which reduces the number of key strokes, necessary to make such a
% complete reference.  But since one never knows where the referenced
% object finally falls, using such a device may result in a page
% reference to the current page which is disturbing and therefore
% should be avoided.
%
%
%
% \section{Loading the package}
%
%
% The suggested way of loading the package these days is by
% \emph{always} using
% the package option \option{nospace},
% \NewIn{2019}
% i.e.,
% \begin{verbatim}
%  \usepackage[nospace]{varioref}
%\end{verbatim}
% See below for an explanation of why this is needed. There are some
% other options that you may want to use additionally; they are
% explained \vpageref{options}.
%
%
%
% \section{The user interface}
%
%\DescribeMacro\vref The implementation of |\vref| below produces only
% a |\ref| when reference and |\label| are on the same page. It will
% additionally produce one of the strings `on the facing page', `on
% the preceding page', or `on the following page' if label and
% reference differ by one; and it will produce both |\ref| and
% |\pageref| when the difference is larger.  The word `facing' is used
% when label and reference both fall onto a double spread.  However,
% if a special page numbering scheme is used instead of the usual
% Arabic numbering (e.g., |\pagenumbering{roman}|) then there will be
% no distinction between one or many pages off.
%
%\DescribeMacro\vpageref Sometimes one wants to refer only to page
% number and again such a reference should normally be suppressed if
% we are referring to the current page. For this purpose the package
% defines the |\vpageref| command. It will produce the same strings as
% |\vref| except that it doesn't start with the |\ref|. A further
%    difference is that
% it will produce the string that is saved in |\reftextcurrent| if
% label and reference fall onto the same page (and no optional
%    argument is used). By defining
% |\reftextcurrent| to produce ``on this page'' or something similar,
% we can avoid that
% \begin{verbatim}
%   ... see the example \vpageref{ex:foo} which shows ...
%\end{verbatim}
% comes out as ``\ldots~see the example which shows~\ldots'', which
% could be misleading.
%
% A space in front of |\vpageref| will be ignored if
% the command doesn't produce any text at all.
%
% But in fact |\vpageref| allows even more control. It has two
% optional arguments. With the first one, one can specify the text
% that should be used if label and reference fall on the same page.
% This is very helpful if both are near to each other, so that they
% may or may not be separated by a page break. In such a case we
% usually know (!) whether the reference is before or after the label
% so that we can say something like
% \begin{verbatim}
%   ... see the example \vpageref[above]{ex:foo} which shows ...
%\end{verbatim}
% which will then come out as ``\ldots~see the example above which
% shows~\ldots'' if we are still on the same page, but as ``\ldots~see
% the example on the page before which shows~\ldots'' (or something
% similar depending on the settings of the |\reftext..before|
% commands) when there was a page break in the meantime. One warning
% however, if you use |\vpageref| with the optional argument to refer
% to a figure or table, keep in mind that depending on the float
% placement parameters the float may show up on top of the current
% page and therefore before the reference even if it came after it in
% the source file.
%
% But maybe you prefer to say ``\ldots~see the above example'' if
% example and reference fall onto the same page, i.e., reverse the
% word order.  In fact, in some languages the word order automatically
% changes in that case.  To allow for this variation the second
% optional argument can be used. It specifies the text preceding the
% generated reference if object and reference do not fall onto the
% same page. Thus one would write
% \begin{verbatim}
%   ... see the \vpageref[above example][example]{ex:foo}
%       which shows ...
%\end{verbatim}
% to achieve the desired effect.
%
%
% \DescribeMacro\vrefrange
% This command is similar to |\vref| but it
% takes two mandatory arguments denoting a range to refer to (e.g., a
% sequence of figures or a sequence of equations, etc.). So if
% |fig:a| is your first figure in the sequence and |fig:c| your last
% you can write
%\begin{verbatim}
%   ... see figures \vrefrange{fig:a}{fig:c} ...
%\end{verbatim}
% which would then be formatted as
% \begin{quote}
% \ldots\ see figures 3.4 to 3.6 on pages 23--24 \ldots
% \end{quote}
% or, if they happen to all fall onto the next page, as
% \begin{quote}
% \ldots\ see figures 3.4 to 3.6 on the following page \ldots
% \end{quote}
% i.e., the command is deciding what to say depending on where the two
% labels are placed in relation to each other; it is essentially
% implemented using |\vpagerefrange| described below.
% The optional argument the command may take is the text to use in case
% both labels are placed on the current page.
%
%
% \DescribeMacro\vpagerefrange This command is similar to |\vpageref|
% but takes two mandatory arguments which are two labels denoting a
% range. If both labels fall onto the same page, the command acts
% exactly like |\vpageref| (with a single label), otherwise it produces
% something like ``on pages~15--18'' (see customization possibilities
% below). The optional argument it may take is the text to use in case
% both labels are placed on the current page.

% \DescribeMacro\vrefpagenum This macro is provided to allow the user
% to write their own small commands which implement functions similar
% to those provided by the two previous commands. It takes two
% arguments: the second is a label (i.e., as used in |\label| or
% |\ref|) and the first is an arbitrary command name (make sure you
% use our own) that receives the page number related to this label.
% So if you have two (or more) labels you could retrieve their page
% numbers, compare them and then decide what to print.  For example,
% the following not very serious definition (also using the
% \pkg{ifthen} package)
%\begin{verbatim}
% \newcommand\amusingversion[2]{the definition%
%   \vrefpagenum\firstnum{#1}%
%   \vrefpagenum\secondnum{#2}%
%   \ifthenelse{\equal\firstnum\secondnum}%
%     {s of \ref{#1} and \ref{#2} \vpageref{#1}}%
%     { of \ref{#1} \vpageref{#1} and of \ref{#2} \vpageref{#2}}%
% }
%
% ...\amusingversion{foo}{bar}
%\end{verbatim}
% will print something like
% \begin{quote}
%  \ldots the definitions of 3 and 4 on the previous page
% \end{quote}
% in the case both labels are on the same page but something like
% \begin{quote}
%  \ldots the definition of 3 on the next page and of 4 on page~13
% \end{quote}
% in case they are on different pages.
%
% \DescribeMacro\vpagerefcompare
% \NewIn{2019}
% For this kind of application the package also provides
% |\vpagerefcompare| as a command that takes four arguments: two labels
% for comparison and a \meta{true} and \meta{false} argument. One of them
% is executed depending on whether the two labels are on the same page
% or on different pages. With its help the above definition could be
% shortened to
%\begin{verbatim}
% \newcommand\amusingversion[2]{the definition%
%   \vpagerefcompare{#1}{#2}%
%     {s of \ref{#1} and \ref{#2} \vpageref{#1}}%
%     { of \ref{#1} \vpageref{#1} and of \ref{#2} \vpageref{#2}}%
% }
%\end{verbatim}
% and you don't have to load the \pkg{ifthen} package any longer to
% make it work.
%
% \DescribeMacro\vpagerefnearby
% \NewIn{2019}
% Another command for conditional processing is |\vpagerefnearby|. It
% takes three arguments: a label and a \meta{true} and \meta{false}
% argument. It compares the page reference to the label with the
% current page number; if each of these is a positive integer
% (expressed in Arabic numerals) and they differ by at most
% $\pm1$, the \meta{true} argument is executed, otherwise the
% \meta{false} argument. In other words it tells you if a |\vpageref|
% to the label would result in a textual reference to the previous,
% current or next page.\footnote{There is also a
% \cs{vpagerefcomparenearby} but this is only meant for package
% writers, so it is only documented in the implementation section.}

%
%
% If you don't use the \texttt{nospace} option the user commands
% |\vref|, |\vpageref|, and |\vpagerefrange| all work by first
% removing any space on their left and then inserting some space of
% their own (|\vref|, for example, a nonbreakable space). That seemed
% like a good idea back then, but it has the disadvantage that you
% can't use these macros in situations where you definitely do not
% want any space before the generated text. E.g., in situations like
% |(\vref{foo} ...)| you end up with a space after the open
% parenthesis.
%
% \DescribeMacro{\vref*}
% \DescribeMacro{\vpageref*}
% \DescribeMacro{\vpagerefrange*}
% Since it was too late to change the default in 2001 I  added star
% versions of the macros which do not add any space before the
% generated text (they do nevertheless remove space at the left).
%
% However, that too has problems: one is that \pkg{hyperref}
% \ChangedIn{2019}
% introduced the star forms as a means of generating references
% without hyperlinks, which is clearly the more important
% application.
% So these days I recommend to always call the package with the option
% \option{nospace} which prevents \pkg{varioref} from messing with the
% space in front. Of course you are then responsible to always add it
% when necessary, but that does make the source more readable so it is
% a good thing. This also has the advantage that the star forms are
% now unnecessary again and can be used in the way implemented by
% \pkg{hyperref} if both packages are used together.
%
% In fact it would be much nicer to make that the
% default but the package has been used by many people for so many
% years that changing the default would break way too many older documents.
%
%
% \DescribeMacro\labelformat
% A reference via |\ref| produces by default the data associated with
% the corresponding |\label| command (typically a number); any
% additional formatting has to be provided by the user. With
% |\labelformat| it is possible to declare such formatting for each
% ``reference'' counter, e.g.,
%\begin{verbatim}
%  \labelformat{section}{section~#1}
%  \labelformat{equation}{equation~(#1)}}
%\end{verbatim}
%
%
% \DescribeMacro\Vref
% \DescribeMacro\Ref
% A side effect of using |\labelformat| is that, depending on the
% defined formatting, it becomes impossible to use |\ref| at the
% beginning of a sentence (if its replacement text starts with a
% lowercase letter).
% \ChangedIn{2019}
% For that reason \pkg{varioref} provided the commands |\Ref| and
% |\Vref|.  They behave like |\ref| and |\vref| except that they
% uppercase the first token of the generated string. These days
% |\labelformat| and |\Ref| are already provided by the \LaTeX{}
% kernel; only |\Vref| is still defined within the \pkg{varioref}
% package.
%
% To make |\Ref| or |\Vref| work properly the very first token in the
% second argument of |\labelformat| has to be a simple \textsc{ascii}
% or UTF-8 letter, otherwise the capitalization will fail or worse,
% you will end up with some error messages. If you actually need
% something more complicated in this place (e.g., an accented letter
% not written as a UTF-8 character) you have to explicitly surround it
% with braces, to identify the part that needs to be capitalized. For
% example, for figure references in the Hungarian language you might
% want to write |\labelformat{figure}{{\'a}bra~\thefigure}| or use
% |\labelformat{figure}{ábra~\thefigure}| which avoids the brace
% problem.
%
% \DescribeMacro\thevpagerefnum
% If you like to have |\vref| suppress the page number on pages where
% label and reference fall onto the same page, but prefer reference to
% page numbers otherwise then |\thevpagerefnum| can be used. This macro
% hold the current page ``number'' when |\vpageref| and friends are
% executed. Thus, by defining, for example,
%\begin{verbatim}
%\renewcommand\reftextfaceafter {on page~\thevpagerefnum}
%\renewcommand\reftextfacebefore{on page~\thevpagerefnum}
%\renewcommand\reftextafter     {on page~\thevpagerefnum}
%\renewcommand\reftextbefore    {on page~\thevpagerefnum}
%\end{verbatim}
% textual references can be suppressed.
%
%
%
% \section{Multi-lingual usage}
%
% The package works well together with the babel system if it is
% loaded \textit{after} the babel package, e.g., a document in English
% (default), French and German text could load the packages as
% follows:
%\begin{verbatim}
%   \usepackage[ngerman,french,english]{babel,varioref}
%\end{verbatim}
% (or in two separate lines if you prefer one |\usepackage| line per
% package). Depending on the current babel language |\vref| and
% friends would then generate strings in different languages. If the
% language options are given as global options to the document class
% then it is enough to use
%\begin{verbatim}
%   \usepackage{babel,varioref}
%\end{verbatim}
% to achieve the same effect.
%
% If more than one language is specified with \pkg{varioref} then
% it will start using the last language selected. Switching of
% languages is managed through Babel; nevertheless all languages of
% interest need to be specified when \pkg{varioref} is loaded so
% that it can integrate their strings into the Babel system.
%
%
% \section{Customization}
%
% The package supports all options defined by the babel package to
% translate the fixed strings into other languages than English.
% (Some languages need updating, however---help is appreciated.)  It
% also supports languages currently not in babel (those can only be
% used standalone, obviously); check the section on options later~on.
%
%
% \pagebreak[3]
%
% You can also modify some or all of the strings by redefining the
% following commands after the package has been loaded.
%\DescribeMacro\reftextbefore
%\DescribeMacro\reftextfacebefore
%\DescribeMacro\reftextafter
%\DescribeMacro\reftextfaceafter Backward references use
% |\reftextbefore| if the label is on the preceding page but invisible
% and |\reftextfacebefore| if it is on the facing page (i.e., if the
% current page number is odd).  Similarly |\reftextafter| is used
% when the label comes on the next page but one has to turn the page
% and |\reftextfaceafter| if it is on the following but facing page.
%
% In fact, |\reftextface...| is used only if the user or the document
% class specified two-sided printing.
%
%\DescribeMacro\reftextfaraway Finally we have |\reftextfaraway| which
% is used whenever label and reference differ by more than one or when
% they aren't numeric. This macro is a bit different because it takes
% one argument, the symbolic reference string, so that one can make
% use of |\pageref| in its replacement text.
%
% In the somewhat unusual case that you want to make some or all of
% the |\reftext...| texts empty, it is necessary to get rid of the
% space that is automatically put in front of them. You can do this by
% defining them to expand to |\unskip|.
%
%
%\DescribeMacro\reftextvario To allow a bit random variation in the
% generated strings one can use the command |\reftextvario| inside the
% string macros. It takes two arguments and selects one or the other
% for printing depending on the number of already seen |\vref| or
% |\vpageref| commands.  As an example see the definitions of
% |\reftextbefore| etc.\ \vpageref[below]{reftextbefore}.
%
% The commands |\vrefrange| and |\vpagerefrange| produce their text
% \NewIn{1998}
% using two macros described below. By redefining them one can modify
% the results to accommodate special requirements.
%
%
% They both take two mandatory arguments denoting the first and the
% last label of the range.
%
%
% \DescribeMacro\reftextpagerange This macro produces text that
% describes the page range of the two labels, e.g., the default
% for English is ``|on pages~\pageref{#1}--\pageref{#2}}|''.
%
%
% \DescribeMacro\reftextlabelrange This macro produces text that
% describes the range of figures, tables, or whatever the labels refer
% to, the default for English is ``|\ref{#1} to~\ref{#2}|''.
%
% 
% \NewIn{2020}
% \DescribeMacro\vrefformat
% \DescribeMacro\Vrefformat
% \DescribeMacro\vrefrangeformat
% \DescribeMacro\fullrefformat
% In some languages (currently only for Japanese) the generated text
% has to typeset in different word order to most other (Western) languages.
% To accommodate for this \cs{vrefformat}, etc.\ has been
% added to allow to alter this on a per language basis.
% There should be normally no need to alter the setup. For details see
% the code section.
%
% \subsection{\ldots\ if Babel is used}
%
% \begin{itshape} If babel is being used then the above commands need to be
% changed using the Babel mechanism, e.g.,
%\begin{verbatim}
%  \addto\extrasngerman{%
%     \renewcommand\reftextfaceafter {auf der n\"achsten Seite}%
%      ... }
%\end{verbatim}
% Otherwise babel will reintroduce its own defaults whenever the language is
% changed (which happens in particular during |\begin{document}| where the
%    main language is selected).
% \end{itshape}
%
%
%
%
% \section{Options} \label{options}
%
% As mentioned above the package supports all standard options offered
% by the Babel system to customize the strings produced, it may also
% have a few not supported by babel, for a full list look
% in section~\vref{sec:impoptions}. In addition it offers the option
% \texttt{draft} to turn error messages into warnings during
% development. The default \texttt{final} produces error message when
% a generated string falls onto a page boundary (see next section).
%
% Newly introduced in 2019 are the options \option{space} (default)
% and \option{nospace}. While the former is the default to allow
% \NewIn{2019}
% documents written in the last twenty years to continue to work
% correctly, I nowadays suggest that you always use the package with
% the option \option{nospace}. This will stop \pkg{varioref} from
% meddling with the spaces preceding commands and thus make the star
% forms |\vref*| and |\vpageref*| unnecessary.
%
% This means that the star forms can then be used as defined by
% \pkg{hyperref} for suppressing a hyperlink when both packages are
% used together (which is a rather typical scenario these days).
%
%
% \section{A few warnings}
%
% Defining commands like the ones described above poses some
% interesting problems. Suppose, for example, that a generated text
% like `on the next page' gets broken across pages. If this happens it
% is very difficult to find an acceptable solution and it can, in fact,
% even result in a document that will always change from one state to
% another (i.e., inserting one string, finding that this is wrong,
% inserting another string on the next run which makes the first
% string correct again, inserting \ldots).  The current implementation
% of \pkg{varioref} therefore issues an error message whenever the
% generated text is broken across page boundaries, e.g.,
% \begin{quote}
%   table 5 on the current \meta{page break} page
% \end{quote}
% would result in an error, which needs to be resolved by the
% user by replacing the |\vref| command with an ordinary |\ref| just
% before the final run.  This is not
% completely satisfactory but in such case no solution really is.
% \DescribeMacro\vrefwarning
% During document preparation, while one is still changing the text,
% such error messages can be turned into warnings by placing a
% |\vrefwarning| command in the preamble. This is equivalent to
% specifying ``draft'' as an option to the package.
% \DescribeMacro\vrefshowerrors
% |\vrefshowerrors| ensures that varioref stops when detecting a
% possible loop. This is the default and equivalent to specifying
% ``final'' as an option.
%
% At the end final a warning: every use of |\vref| will internally
% generate two macro names to keep track of the string positions
% within the document. As a result you may run out of name space or
% main memory\footnote{Not really that likely these days, but one
% never knows \ldots.  In any case \TeX{} will process your document a
% tiny bit faster.} if you make heavy use of this macro on a small
% \TeX{} installation.
%\DescribeMacro\fullref For this reason the primitive command
% |\fullref| is also provided. This command can be used whenever you
% know for sure that label and reference can't fall onto nearby pages.
%
%
% \MaybeStop{\PrintIndex\PrintChanges}
%
%
% \section{The documentation driver file}
%
% The next bit of code contains the documentation driver file for
% \TeX{}, i.e., the file that will produce the documentation you are
% currently reading. It will be extracted from this file by the
% \pkg{docstrip} program.
%    \begin{macrocode}
%<*driver>
\documentclass{ltxdoc}
\usepackage{multicol,varioref}
\GetFileInfo{varioref.sty}
\setlength\hfuzz{1pt}    % ignore slight overfulls
\EnableCrossrefs
%\DisableCrossrefs   % Say \DisableCrossrefs if index is ready

\RecordChanges       % Gather update information
%\OnlyDescription    % comment out for implementation details
\begin{document}
   \DocInput{varioref.dtx}
\end{document}
%</driver>
%    \end{macrocode}
%
%
% \section{The implementation}
%
% The main implementation idea is to generate an internal label
% command for every |\vpageref| and compare the page reference of this
% label with the page reference of the user-requested label.  Since
% this means one additional macro name for each use of |\vpageref| or
% |vref| (which is implemented in terms of |\vpageref|) the memory
% requirements of this package may be high in terms of main and macro
% name memory.  Since the information held in the internal labels is
% used only once one could envision a different scheme if suitable
% primitives for this kind of ``one place information'' would be
% provided by \LaTeX.  This type of data structure is planned for
% \LaTeX3 but for the moment we have to live with the memory
% restrictions.
%
% We start by checking if this file was already loaded. If not we
% identify the current version. This is actually done at the top
% of the file, so we comment it out here
% \changes{v0.1h}{1993/08/15}{Small documentation changes}
%    \begin{macrocode}
%<*package>
%\NeedsTeXFormat{LaTeX2e}[1994/06/01]
%\ProvidesPackage{varioref}[\filedate\space\fileversion\space
%                     LaTeX2e package for extended references (FMi)]
%    \end{macrocode}
%
%
%  \begin{macro}{\vref@addto}
% \changes{v1.0b}{1994/01/31}{Avoid using babel `addto}
% \changes{v1.0b}{1994/01/31}{The babel commands are starting
%                             with extras}
%    To support the use of babel we want to add the additional strings
%    to the |\extras|\meta{language} commands. Since |\addto| in the
%    current implementation of babel has a bug that does not allow to
%    use arguments containing hashmarks we do this by hand.
%    \begin{macrocode}
\def\vref@addto#1#2{%
  #2%
  \@temptokena{#2}%
  \ifx#1\undefined
     \edef#1{\the\@temptokena}%
  \else
     \toks@\expandafter{#1}%
     \edef#1{\the\toks@\the\@temptokena}%
  \fi
  \@temptokena{}\toks@\@temptokena
}
\@onlypreamble\vref@addto
%    \end{macrocode}
%  \end{macro}
%
%
% \subsection{Options}\label{sec:impoptions}
%
%  \begin{macro}{\vref@excuse}
%    Excuse that we don't know the strings for a certain language.
% \changes{v1.0q}{1995/04/06}{Use `PackageWarning}
%    \begin{macrocode}
\def\vref@excuse#1{%
  \PackageWarningNoLine{varioref}{Sorry, language `#1'
            not supported%
            \MessageBreak
            in this version.
            English strings used by default.
            \MessageBreak
            Please modify \protect\reftext... commands manually.%
            \MessageBreak\MessageBreak
            If you can suggest translations for
            this language,%
            \MessageBreak
            please mail them
            to the author of this package}}
\@onlypreamble\vref@excuse
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\vref@stringwarning}
%    And we sometimes just don't know some strings~\ldots
% \changes{v1.2a}{1998/08/01}{Macro added}
%    \begin{macrocode}
\def\vref@stringwarning#1{%
  \PackageWarningNoLine{varioref}{Sorry, there is no proper
            translation for the string\MessageBreak
            produced by \protect#1\on@line.\MessageBreak
            English string used instead.\MessageBreak
            \MessageBreak
            If you can suggest translations for
            the current\MessageBreak
            language, please mail them
            to the author of this\MessageBreak package}}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\DeclareVrefOptions}
%    This macro allows to declare multiple identical options (given
%    as a comma-separated list) in one go.  This is useful for
%    language aliases and varieties with non-varying strings (such as
%    the German varieties).
%
%    We use this command also for cases where there is currently only
%    a single name to have a consistent interface (and make adding
%    additional names easy). The only exceptions are the cases where
%    we have to make excuses because we are still missing
%    translations.
% \changes{v1.6h}{2025/12/31}{Macro added}
%    \begin{macrocode}
\def\DeclareVrefOptions#1#2{%
  \@for\vref@list@item:=#1\do{%
    \ExpandArgs{oo}%
    \DeclareOption{\vref@list@item}%
                  {\expandafter\vref@addto
                    \csname extras\vref@list@item \endcsname{#2}}%
   }%
}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\reftextfaceafter}
%  \begin{macro}{\reftextfacebefore}
%  \begin{macro}{\reftextafter}
%  \begin{macro}{\reftextbefore}
%  \begin{macro}{\reftextcurrent}
% \label{reftextbefore} The options do set the macros that
%    generate the textual strings. Note that they do not start with a
%    space, the space is already added in the main macro below.
% \changes{v1.2a}{1998/08/22}{Added American defaults for
%      \cs{reftextpagerange} and \cs{reftextlabelrange}}
% \changes{v1.4d}{2002/11/11}{Changed default for \cs{reftextbefore}}
%
%    Afrikaans option contributed by Danie Els
%    (\texttt{dnjels@sun.ac.za}).
% \changes{v1.4g}{2003/03/29}{Added afrikaans option}
%    \begin{macrocode}
\DeclareVrefOptions{afrikaans}
  {\def\reftextfaceafter {op die \reftextvario{regterbladsy}%
                                               {bladsy langsaan}}%
    \def\reftextfacebefore{op die \reftextvario{linkerbladsy}%
                                                {bladsy langsaan}}%
    \def\reftextafter     {op die \reftextvario{volgende bladsy}%
                                               {bladsy hierna}}%
    \def\reftextbefore    {op die \reftextvario{vorige bladsy}%
                                               {bladsy hiervoor}}%
    \def\reftextcurrent   {op \reftextvario{hierdie}%
                                           {die huidige} bladsy}%
    \def\reftextfaraway#1{op bladsy~\pageref{#1}}%
    \def\reftextpagerange#1#2{op bladsye~\pageref{#1}--\pageref{#2}}%
    \def\reftextlabelrange#1#2{\ref{#1} tot~\ref{#2}}%
    \let\vrefformat\vrefdefaultformat
    \let\Vrefformat\Vrefdefaultformat
    \let\fullrefformat\fullrefdefaultformat
    \let\vrefrangeformat\vrefrangedefaultformat
  }
%    \end{macrocode}
%  
% \changes{v1.2a}{1998/08/22}{Added english defaults for
%      \cs{reftextpagerange} and \cs{reftextlabelrange}}
% \changes{v1.4d}{2002/11/11}{Changed default for \cs{reftextbefore}}
%    \begin{macrocode}
\DeclareVrefOptions{american,english}
  {\def\reftextfaceafter {on the \reftextvario{facing}{next} page}%
    \def\reftextfacebefore{on the \reftextvario{facing}{preceding}
                           page}%
    \def\reftextafter     {on the \reftextvario{following}{next} page}%
    \def\reftextbefore    {on the \reftextvario{preceding}{previous} page}%
    \def\reftextcurrent   {on \reftextvario{this}{the current} page}%
    \def\reftextfaraway#1{on page~\pageref{#1}}%
    \def\reftextpagerange#1#2{on pages~\pageref{#1}--\pageref{#2}}%
    \def\reftextlabelrange#1#2{\ref{#1} to~\ref{#2}}%
    \let\vrefformat\vrefdefaultformat
    \let\Vrefformat\Vrefdefaultformat
    \let\fullrefformat\fullrefdefaultformat
    \let\vrefrangeformat\vrefrangedefaultformat
  }
%    \end{macrocode}
%
%    Arabic option text was contributed by Ihab Samir Mattar
%    (\texttt{dr\_kremlin@hotmail.com}). As our standard documentation
%    workflow uses pdf\TeX{} the Arabic letters can't be displayed
%    easily, so you will see missing glyphs below. To see the real
%    letters you have to look at the source or package file.
% \changes{v1.6b}{2019/09/08}{Option arabic added}
% \begin{allowtofu}
%    \begin{macrocode}
\DeclareVrefOptions{arabic}
  {\def\reftextfaceafter {بالصفحة \reftextvario{المقابلة}{اللاحقة}}%
    \def\reftextfacebefore{بالصفحة \reftextvario{المقابلة}{المُنْصَرِمَةٌ}}%
    \def\reftextafter     {بالصفحة \reftextvario{اللاحقة}{التالية}}%
    \def\reftextbefore    {بالصفحة \reftextvario{السابقة}{المُنْصَرِمَةٌ}}%
    \def\reftextcurrent   {ب\reftextvario{الصفحة الحالية}{هذه الصفحة}}%
    \def\reftextfaraway#1{بالصفحة رقم~\pageref{#1}}%
    \def\reftextpagerange#1#2{بالصفحات~\pageref{#1}--\pageref{#2}}%
    \def\reftextlabelrange#1#2{\ref{#1} حتى~\ref{#2}}%
    \let\vrefformat\vrefdefaultformat
    \let\Vrefformat\Vrefdefaultformat
    \let\fullrefformat\fullrefdefaultformat
    \let\vrefrangeformat\vrefrangedefaultformat
  }
%    \end{macrocode}
% \end{allowtofu}
% \changes{v1.2a}{1998/11/27}{Added austrian defaults (identical to german)}
% \changes{v1.2d}{2000/01/11}{Added naustrian defaults (identical to german)}
% \changes{v1.2d}{2000/01/11}{Added ngerman defaults (identical to german)}
% \changes{v1.4n}{2005/07/24}{Small change}
% \changes{v1.6h}{2025/12/31}{Added defaults for swissgerman and nswissgerman (identical to german)}
%    All German varieties (Austrian, Swiss, German, 1901 and 1996 orthography) use the same strings.
%    \begin{macrocode}
\DeclareVrefOptions{austrian,naustrian,german,ngerman,swissgerman,nswissgerman}
  {\def\reftextfaceafter {auf der n\"achsten Seite}%
    \def\reftextfacebefore{auf der vorherigen Seite}%
    \let\reftextafter     \reftextfaceafter
    \let\reftextbefore    \reftextfacebefore
    \def\reftextcurrent   {auf dieser Seite}%
    \def\reftextfaraway#1{auf Seite~\pageref{#1}}%
    \def\reftextpagerange#1#2{auf Seiten~\pageref{#1}--\pageref{#2}}%
    \def\reftextlabelrange#1#2{\ref{#1} bis~\ref{#2}}%
    \let\vrefformat\vrefdefaultformat
    \let\Vrefformat\Vrefdefaultformat
    \let\fullrefformat\fullrefdefaultformat
    \let\vrefrangeformat\vrefrangedefaultformat
  }
%    \end{macrocode}
%    There are no good variants for German (I think and still think but
%    this is a matter of taste :-)).
% \changes{v1.0b}{1994/01/31}{Replace in incorrect `def by `let}
%    The following definitions were recently suggested to me but since
%    the originals have been there for a long time I don't want to change them
%    now since that could make a lot of documents change their formatting.
%    If you fancy them, add a redefinition of the corresponding macro(s)
%    to the preamble of your document.
%\begin{verbatim}
%    \def\reftextfaceafter {auf der \reftextvario
%          {gegen\"uberliegenden}{anderen} Seite}%
%    \def\reftextfacebefore {auf der \reftextvario
%          {gegen\"uberliegenden}{anderen} Seite}%
%    \def\reftextafter     {auf der \reftextvario
%          {n\"achsten}{folgenden} Seite}%
%    \def\reftextbefore    {auf der \reftextvario
%          {vorigen}{vorhergehenden} Seite}%
%    \def\reftextcurrent   {\reftextvario
%          {auf dieser}{diese} Seite}%
%\end{verbatim}
% \changes{v1.4n}{2005/07/24}{Small change}
%    Text for basque defaults was contributed by
%    I\~naki Larra\~naga Murgoitio (aka dooteo)
%    (|<dooteo@euskalgnu.org>|).
% \changes{v1.4k}{2005/04/09}{Basque defaults added.}
%    \begin{macrocode}
\DeclareVrefOptions{basque}
  {\def\reftextfaceafter {hurrengo orrialdean}%
    \def\reftextfacebefore{aurreko orrialdean}%
    \let\reftextafter     \reftextfaceafter
    \let\reftextbefore    \reftextfacebefore
    \def\reftextcurrent   {uneko orrialdean}%
    \def\reftextfaraway#1{~\pageref{#1}. orrialdean}%
    \def\reftextpagerange#1#2{~\pageref{#1}--\pageref{#2} orrialdeetan}%
    \def\reftextlabelrange#1#2{\ref{#1}.etik \ref{#2}.eraino}%
    \let\vrefformat\vrefdefaultformat
    \let\Vrefformat\Vrefdefaultformat
    \let\fullrefformat\fullrefdefaultformat
    \let\vrefrangeformat\vrefrangedefaultformat
  }
%    \end{macrocode}
%    Text for the Bahasa Malaysia defaults was contributed by
%    Bob Margolis 2005-12-02.
%
%    Notes: pada muka surat translates as ``on the page'' though BM has no
%    definite (or indefinite) article; adjectives and other modifiers follow
%    the noun (clause); bertentangan is ``opposite'' in the sense of
%    ``facing''; berikutnya is ``next'' (in this context - actually
%    next-to-this, literally); berikutnya also translates as ``following
%    this''; sebelumnya is ``preceding'', also ``previous''; ``ini'' translates,
%    literally, as ``this'' but is also used in the sense of current page.
% \changes{v1.4o}{2005/12/02}{Bahasa Malaysia defaults added.}
%    \begin{macrocode}
\DeclareVrefOptions{bahasam}
  {\def\reftextfaceafter {pada muka surat \reftextvario{bertentangan}{berikutnya}}%
    \def\reftextfacebefore{pada muka surat \reftextvario{bertentangan}{sebelumnya} }%
    \def\reftextafter     {pada muka surat berikutnya}%
    \def\reftextbefore    {pada muka surat sebelumnya}%
    \def\reftextcurrent   {pada muka surat ini}%
    \def\reftextfaraway#1{pada muka surat~\pageref{#1}}%
    \def\reftextpagerange#1#2{pada muka surat~\pageref{#1}--\pageref{#2}}%
    \def\reftextlabelrange#1#2{\ref{#1}--\ref{#2}}%
    \let\vrefformat\vrefdefaultformat
    \let\Vrefformat\Vrefdefaultformat
    \let\fullrefformat\fullrefdefaultformat
    \let\vrefrangeformat\vrefrangedefaultformat
  }
%    \end{macrocode}
%    Text for brazil defaults was contributed by
%    Alcino Dall Igna Junior\\
%    (|adij@di.ufpe.br|).
% \changes{v1.0g}{1994/05/18}{Brazil defaults added.}
% \changes{v1.4o}{2005/11/07}{Added a few more brazil strings}
% \changes{v1.4r}{2007/05/26}{Misspelling of \cs{extrasbrazil}}
%    \begin{macrocode}
\DeclareVrefOptions{brazil}
  {\def\reftextfaceafter {na \reftextvario{p\'agina oposta}{pr\'oxima
                           p\'agina}}%
    \def\reftextfacebefore{na p\'agina \reftextvario{oposta}{anterior}}%
    \def\reftextafter     {na \reftextvario{p\'agina seguinte}{pr\'oxima
                           p\'agina}}%
    \def\reftextbefore{na p\'agina \reftextvario{anterior}{precedente}}%
    \def\reftextcurrent   {\reftextvario{nesta p\'agina}{na p\'agina
                           corrente}}%
    \def\reftextfaraway#1{na p\'agina~\pageref{#1}}%
    \def\reftextpagerange#1#2{nas p\'aginas~\pageref{#1}--\pageref{#2}}%
    \def\reftextlabelrange#1#2{\ref{#1} a~\ref{#2}}%
    \let\vrefformat\vrefdefaultformat
    \let\Vrefformat\Vrefdefaultformat
    \let\fullrefformat\fullrefdefaultformat
    \let\vrefrangeformat\vrefrangedefaultformat
  }
%    \end{macrocode}
%    Text for Breton defaults was contributed by
%    Christian ROLLAND\\
%    (|Christian.Rolland@univ-brest.fr|).
% \changes{v1.0o}{1994/09/27}{Added defaults for breton}
%    \begin{macrocode}
\DeclareOption{breton}
  {\vref@excuse{breton}%
   \vref@addto\extrasbreton{%
    \def\reftextfaceafter {war ar bajenn \reftextvario{a-dal}{da heul}}%
    \def\reftextfacebefore{war ar bajenn \reftextvario{a-dal}{a-raok}}%
    \def\reftextafter     {war ar bajenn da heul}%
    \def\reftextbefore    {war ar bajenn a-raok}%
    \def\reftextcurrent   {war ar \reftextvario{bajenn-ma\~n}%
                                               {bajenn war-wel}}%
    \def\reftextfaraway#1{war ar bajenn~\pageref{#1}}%
    \def\reftextpagerange#1#2{\vref@stringwarning\reftextpagerange
                              on pages~\pageref{#1}--\pageref{#2}}%
    \def\reftextlabelrange#1#2{\vref@stringwarning\reflabelpagerange
                               \ref{#1} to~\ref{#2}}%
    \let\vrefformat\vrefdefaultformat
    \let\Vrefformat\Vrefdefaultformat
    \let\fullrefformat\fullrefdefaultformat
    \let\vrefrangeformat\vrefrangedefaultformat
  }}
%    \end{macrocode}
%    Text for Bulgarian defaults was contributed by
%    Georgi Boshnakov\\  (|georgi.boshnakov@gmail.com|).
% \changes{v1.4q}{2006/05/23}{Added defaults for bulgarian}
%    \begin{macrocode}
\DeclareVrefOptions{bulgarian}%
 {\def\reftextfaceafter{\cyrn\cyra\
         \reftextvario{\cyrs\cyrery\cyrs\cyre\cyrd\cyrn\cyra\cyrt\cyra}%
                      {\cyrs\cyrl\cyre\cyrd\cyrv\cyra\cyrshch\cyra\cyrt\cyra}
         \cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyra}%
   \def\reftextfacebefore{\cyrn\cyra\
         \reftextvario{\cyrs\cyrery\cyrs\cyre\cyrd\cyrn\cyra\cyrt\cyra}%
                      {\cyrp\cyrr\cyre\cyrd\cyrn\cyra\cyrt\cyra}
         \cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyra}%
   \def\reftextafter{\cyrn\cyra\
         \reftextvario{\cyrs\cyrl\cyre\cyrd\cyrv\cyra\cyrshch\cyra\cyrt\cyra}%
                      {\cyrs\cyrl\cyre\cyrd\cyrv\cyra\cyrshch\cyra\cyrt\cyra}
         \cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyra}%
   \def\reftextbefore{\cyrn\cyra\
         \reftextvario{\cyrp\cyrr\cyre\cyrd\cyrn\cyra\cyrt\cyra}%
                      {\cyrp\cyrr\cyre\cyrd\cyri\cyrsh\cyrn\cyra\cyrt\cyra}
         \cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyra}%
   \def\reftextcurrent{\cyrn\cyra\
         \reftextvario{\cyrt\cyra\cyrz\cyri}%
                      {\cyrt\cyre\cyrk\cyru\cyrshch\cyra\cyrt\cyra}
         \cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyra}%
   \def\reftextfaraway#1{\cyrn\cyra\ \cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyra
                         ~\pageref{#1}}%
   \def\reftextpagerange#1#2{\cyrn\cyra\
                        \cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyri
                        ~\pageref{#1}--\pageref{#2}}%
   \def\reftextlabelrange#1#2{\ref{#1} \cyrd\cyro~\ref{#2}}%
    \let\vrefformat\vrefdefaultformat
    \let\Vrefformat\Vrefdefaultformat
    \let\fullrefformat\fullrefdefaultformat
    \let\vrefrangeformat\vrefrangedefaultformat
 }
%    \end{macrocode}
%    Text for catalan defaults was contributed by Robert Fuster\\
%    (\verb=rfuster@mat.upv.es=).
% \changes{v1.1c}{1997/06/12}{Added defaults for catalan}
% \changes{v1.2g}{2000/08/22}{Updated defaults for catalan}
%    \begin{macrocode}
\DeclareVrefOptions{catalan}
  {\def\reftextfaceafter {a la p\`agina seg\"uent}%
    \def\reftextfacebefore{a la p\`agina anterior}%
    \let\reftextafter     \reftextfaceafter
    \let\reftextbefore    \reftextfacebefore
    \def\reftextcurrent   {en aquesta p\`agina}%
    \def\reftextfaraway#1{a la p\`agina~\pageref{#1}}%
    \def\reftextpagerange#1#2{a les
                     p\`agines~\pageref{#1}--\pageref{#2}}%
    \def\reftextlabelrange#1#2{\ref{#1} a~\ref{#2}}%
    \let\vrefformat\vrefdefaultformat
    \let\Vrefformat\Vrefdefaultformat
    \let\fullrefformat\fullrefdefaultformat
    \let\vrefrangeformat\vrefrangedefaultformat
  }
%    \end{macrocode}
%    Text for croatian defaults was contributed by \v{S}ime Ungar
%    (\verb=ungar@math.hr=).
% \changes{v1.4p}{2006/05/13}{Added defaults for croatian}
%    \begin{macrocode}
\DeclareVrefOptions{croatian}
   {\def\reftextfaceafter {na sljede\'coj stranici}%
     \def\reftextfacebefore{na prethodnoj stranici}%
     \let\reftextafter     \reftextfaceafter
     \let\reftextbefore    \reftextfacebefore
     \def\reftextcurrent   {na ovoj stranici}%
     \def\reftextfaraway#1{na stranici~\pageref{#1}}%
     \def\reftextpagerange#1#2{na stranicama~\pageref{#1}--\pageref{#2}}%
     \def\reftextlabelrange#1#2{\ref{#1} do~\ref{#2}}%
    \let\vrefformat\vrefdefaultformat
    \let\Vrefformat\Vrefdefaultformat
    \let\fullrefformat\fullrefdefaultformat
    \let\vrefrangeformat\vrefrangedefaultformat
   }
%    \end{macrocode}
%    Defaults for the Czech option provided by Milan Vancura
%    \verb=<milan@suse.cz>=.
% \changes{v1.2e}{2000/04/04}{Added czech defaults}
%    \begin{macrocode}
\DeclareVrefOptions{czech}
  {\def\reftextfaceafter {na n\'a\-sle\-du\-j\'\i c\'\i\ stran\v{e}}%
    \def\reftextfacebefore{na p\v{r}ed\-choz\'\i\ stran\v{e}}%
    \def\reftextafter     {na n\'a\-sle\-du\-j\'\i c\'\i\ stran\v{e}}%
    \def\reftextbefore    {na p\v{r}ed\-choz\'\i\ stran\v{e}}%
    \def\reftextcurrent   {na t\'eto stran\v{e}}%
    \def\reftextfaraway#1{na stran\v{e}~\pageref{#1}}%
    \def\reftextpagerange#1#2{na stran\'ach~\pageref{#1}\--\pageref{#2}}%
    \def\reftextlabelrange#1#2{\ref{#1} a\v{z}~\ref{#2}}%
    \let\vrefformat\vrefdefaultformat
    \let\Vrefformat\Vrefdefaultformat
    \let\fullrefformat\fullrefdefaultformat
    \let\vrefrangeformat\vrefrangedefaultformat
  }
%    \end{macrocode}
%    Defaults for Danish provided by Torsten Martinsen
%    (\verb=tmar91@kom.auc.dk=). Further defaults by Ole Laursen
%    (\verb=olau@hardworking.dk=).
% \changes{v1.0n}{1994/09/25}{Added Danish defaults}
% \changes{v1.2h}{2000/12/30}{Updates to Danish defaults}
%    \begin{macrocode}
\DeclareVrefOptions{danish}
  {\def\reftextfaceafter {p\aa{} \reftextvario{modst\aa ende}%
                                               {n\ae ste} side}%
    \def\reftextfacebefore{p\aa{} \reftextvario{modst\aa ende}%
                                               {forrige} side}%
    \def\reftextafter     {p\aa{} \reftextvario{den f\o lgende}%
                                               {n\ae ste} side}%
    \def\reftextbefore    {p\aa{} \reftextvario{forrige side}
                                               {foreg\aa ende side}}%
    \def\reftextcurrent   {p\aa{} denne side}%
    \def\reftextfaraway#1{p\aa{} side~\pageref{#1}}%
    \def\reftextpagerange#1#2{p\aa{} side~\pageref{#1}--\pageref{#2}}%
    \def\reftextlabelrange#1#2{\ref{#1} til~\ref{#2}}%
    \let\vrefformat\vrefdefaultformat
    \let\Vrefformat\Vrefdefaultformat
    \let\fullrefformat\fullrefdefaultformat
    \let\vrefrangeformat\vrefrangedefaultformat
  }
%    \end{macrocode}
%    Default strings for Dutch have been contributed by Frank Poppe
%    (\verb=POPPE@SWOV.NL=).
%    This option currently supports one additional string macro
%    |\refpagename| so that you can easily change to |bladzijde|
%    instead of |pagina| if you prefer this word for ``page''.
%    However, I will not guarantee that this will survive future
%    versions of this package, so use it on your own risk (you can
%    always update the full strings to be on the safe side).
% \changes{v1.0l}{1994/07/07}{Added dutch defaults}
% \changes{v1.2a}{1998/08/22}{Added dutch defaults for
%      \cs{reftextpagerange} and \cs{reftextlabelrange}}
%    \begin{macrocode}
\DeclareVrefOptions{dutch}
  {\def\refpagename{pagina}%
    \def\reftextfaceafter {op de \reftextvario{rechter \refpagename}%
                                          {\refpagename\ hiernaast}}%
    \def\reftextfacebefore{op de \reftextvario{linker \refpagename}%
                                         {\refpagename\ hiernaast}}%
    \def\reftextafter     {op de \reftextvario{volgende \refpagename}%
                                              {\refpagename\ hierna}}%
    \def\reftextbefore    {op de \reftextvario{vorige \refpagename}%
                                          {\refpagename\ hiervoor}}%
    \def\reftextcurrent   {op deze \refpagename}%
    \def\reftextfaraway#1{op \refpagename~\pageref{#1}}%
%    \end{macrocode}
%    Concerning the next defaults I received the following comment by
%    Frederik Fouvry \texttt{<fouvry@coli.uni-sb.de>}:
%    ``In the Dutch options (where I can exert a proper language
%    judgement ;-), `t/m' is not used in formal (scientific) texts.  I
%    would either use `--' or `tot en met' (the abbreviation written
%    out). ''
% \changes{v1.4d}{2002/11/11}{Changed default for \cs{reftextlabelrange}}
% \changes{v1.4m}{2005/06/09}{Fixed \cs{reftextlabelrange} (pr/3791)}
%    \begin{macrocode}
    \def\reftextpagerange#1#2{op pagina's~\pageref{#1}--\pageref{#2}}%
    \def\reftextlabelrange#1#2{\ref{#1}--\ref{#2}}%
    \let\vrefformat\vrefdefaultformat
    \let\Vrefformat\Vrefdefaultformat
    \let\fullrefformat\fullrefdefaultformat
    \let\vrefrangeformat\vrefrangedefaultformat
  }
%    \end{macrocode}
%
%    The esperanto strings were suggested by Albert Reiner
%    (\verb=areiner@tph.tuwien.ac.at=).
%  \changes{v1.4x}{2010/08/04}{Defaults for esperanto added}
%    \begin{macrocode}
\DeclareVrefOptions{esperanto}
  {\def\reftextfaceafter{en la
        \reftextvario{flanka}{sekva} pa\^go}%
    \def\reftextfacebefore{en la
        \reftextvario{flanka}{anta\u ua} pa\^go}%
    \def\reftextafter{en la sekva pa\^go}%
    \def\reftextbefore{en la anta\u ua pa\^go}%
    \def\reftextcurrent{\reftextvario{\^ci-pa\^ge}%
        {en \^ci tiu pa\^go}}%
    \def\reftextfaraway#1{en pa\^go~\pageref{#1}}%
    \def\reftextpagerange#1#2{en pa\^goj~\pageref{#1} \^gis \pageref{#2}}%
    \def\reftextlabelrange#1#2{\ref{#1} \^gis~\ref{#2}}%
    \let\vrefformat\vrefdefaultformat
    \let\Vrefformat\Vrefdefaultformat
    \let\fullrefformat\fullrefdefaultformat
    \let\vrefrangeformat\vrefrangedefaultformat
  }
%    \end{macrocode}
%    The Finnish strings were suggested by Matti Rintala
%    (\verb=bitti@cs.tut.fi=) and Hillevi Gavel
%    (\verb=Hillevi.Gavel@mdh.se=).
% \changes{v1.0m}{1994/09/23}{Added finnish strings}
% \changes{v1.4o}{2005/11/07}{Added a few more finnish strings}
%    \begin{macrocode}
\DeclareVrefOptions{finnish}
  {\def\reftextfaceafter {\reftextvario{viereisell\"a}%
                                        {seuraavalla} sivulla}%
    \def\reftextfacebefore{\reftextvario{viereisell\"a}%
                                        {edellisell\"a} sivulla}%
    \def\reftextafter     {seuraavalla sivulla}%
    \def\reftextbefore    {edellisell\"a sivulla}%
    \def\reftextcurrent   {t\"all\"a sivulla}%
    \def\reftextfaraway#1{sivulla~\pageref{#1}}%
     \def\reftextpagerange#1#2{sivuilla~\pageref{#1}--\pageref{#2}}%
%    \end{macrocode}
%    Can't combine numbers with the necessary suffix well.
%    \begin{macrocode}
     \def\reftextlabelrange#1#2{\ref{#1}--\ref{#2}}%
    \let\vrefformat\vrefdefaultformat
    \let\Vrefformat\Vrefdefaultformat
    \let\fullrefformat\fullrefdefaultformat
    \let\vrefrangeformat\vrefrangedefaultformat
  }
%    \end{macrocode}
%    French defaults are provided by Daniel Flippo
%    (\verb=Daniel.Flipo@univ-lille1.fr=).
% \changes{v1.0j}{1994/06/21}{Added french defaults}
% \changes{v1.2a}{1998/08/22}{Added french defaults for
%      \cs{reftextpagerange} and \cs{reftextlabelrange}}
%    \begin{macrocode}
\DeclareVrefOptions{french}
  {\def\reftextfaceafter {page \reftextvario{ci-contre}{suivante}}%
    \def\reftextfacebefore{page \reftextvario{ci-contre}%
                          {pr\'ec\'edente}}%
    \def\reftextafter     {page suivante}%
    \def\reftextbefore    {page pr\'ec\'edente}%
    \def\reftextcurrent   {de la pr\'esente page}%
    \def\reftextfaraway#1{page~\pageref{#1}}%
    \def\reftextpagerange#1#2{pages~\pageref{#1}--\pageref{#2}}%
    \def\reftextlabelrange#1#2{\ref{#1} \`a~\ref{#2}}%
    \let\vrefformat\vrefdefaultformat
    \let\Vrefformat\Vrefdefaultformat
    \let\fullrefformat\fullrefdefaultformat
    \let\vrefrangeformat\vrefrangedefaultformat
  }
%    \end{macrocode}
%    Galician defaults are provided by Matthias Moebius\\
%    (\texttt{Matthias.Moebius@uni-konstanz.de}).
% \changes{v1.1f}{1998/04/25}{Added galician defaults}
% \changes{v1.4o}{2005/11/10}{Added further galician defaults}
% \changes{v1.4o}{2005/11/26}{Some further corrections}
% \changes{v1.5b}{2015/09/22}{Fixed blunder from 2005 -
%                             galician option clearly never used}
%    \begin{macrocode}
\DeclareVrefOptions{galician}
  {\def\reftextfaceafter {na p\'axina oposta}%
    \def\reftextfacebefore\reftextfaceafter
    \def\reftextafter     {na p\'axina seguinte}%
    \def\reftextbefore    {na p\'axina anterior}%
    \def\reftextcurrent   {nesta p\'axina}%
    \def\reftextfaraway#1{na p\'axina~\pageref{#1}}%
     \def\reftextpagerange#1#2{%
                nas p\'axinas~\pageref{#1}-\pageref{#2}}%
     \def\reftextlabelrange#1#2{\ref{#1} a~\ref{#2}}%
    \let\vrefformat\vrefdefaultformat
    \let\Vrefformat\Vrefdefaultformat
    \let\fullrefformat\fullrefdefaultformat
    \let\vrefrangeformat\vrefrangedefaultformat
  }
%    \end{macrocode}
%    Defaults for greek suggested by Apostolos Syropoulos\\
%    (\verb=apostolo@obelix.ee.duth.gr=).
% \changes{v1.2a}{1998/08/22}{Added defaults for greek}
%    \begin{macrocode}
\DeclareVrefOptions{greek}
  {\def\reftextfaceafter {sthn \reftextvario{paro'usa}%
                           {ep'omenh} sel'ida}%
    \def\reftextfacebefore{sthn \reftextvario{paro'usa}{prohgo'umenh}
                           sel'ida}%
    \def\reftextafter     {sthn ep'omenh sel'ida}%
    \def\reftextbefore    {sthn prohgo'umenh sel'ida}%
    \def\reftextcurrent   {s'' aut'h th sel'ida}%
    \def\reftextfaraway#1{sth sel'ida\nobreakspace\pageref{#1}}%
    \def\reftextpagerange#1#2{stis sel'ides\nobreakspace
                          \pageref{#1}---\pageref{#2}}%
    \def\reftextlabelrange#1#2{\ref{#1} ws\nobreakspace\ref{#2}}%
    \let\vrefformat\vrefdefaultformat
    \let\Vrefformat\Vrefdefaultformat
    \let\fullrefformat\fullrefdefaultformat
    \let\vrefrangeformat\vrefrangedefaultformat
  }
%    \end{macrocode}
%    Icelandic defaults suggested by Thorhallur Sverrisson
%    (\verb=thorhs@basis.is=).
% \changes{v1.4t}{2007/09/07}{Added defaults for icelandic}
%    \begin{macrocode}
\DeclareVrefOptions{icelandic}
  {\def\reftextfaceafter {\'{a} \reftextvario{n{\ae}stu}%
                                              {n{\ae}stu} s\'{i}{\dh}u}%
    \def\reftextfacebefore{\'{a} \reftextvario{fyrri}%
                                              {fyrri} s\'{i}{\dh}u}%
    \def\reftextafter     {\'{a} \reftextvario{n{\ae}stu}%
                                              {n{\ae}stu} s\'{i}{\dh}u}%
    \def\reftextbefore    {\'{a} \reftextvario{fyrri}{fyrri} s\'{i}{\dh}u}%
    \def\reftextcurrent   {\'{a} \reftextvario{{\th}essari}%
                                              {{\th}essari} s\'{i}{\dh}u}%
    \def\reftextfaraway#1{\'{a} s\'{i}{\dh}u~\pageref{#1}}%
    \def\reftextpagerange#1#2{\'{a} s\'{i}{\dh}um~\pageref{#1}--\pageref{#2}}%
    \def\reftextlabelrange#1#2{\ref{#1} til~\ref{#2}}%
    \let\vrefformat\vrefdefaultformat
    \let\Vrefformat\Vrefdefaultformat
    \let\fullrefformat\fullrefdefaultformat
    \let\vrefrangeformat\vrefrangedefaultformat
  }
%    \end{macrocode}
%    Defaults for Italian suggested by Giovanni Pensa
%    (\verb=pensa@dsi.unimi.it=) with i{\TeX}nici.
% \changes{v1.1b}{1995/10/19}{Added defaults for Italian}
% \changes{v1.2a}{1998/08/22}{Removed incorrect warning}
% \changes{v1.4k}{2004/10/30}{Added missing defaults supplied by Lapo Mori}
% \changes{v1.4n}{2005/07/24}{Small change}
% \changes{v1.4u}{2009/03/21}{Correction for \cs{reftextfaraway} suggested
%                             by Lorenzo Pantieri}
%    \begin{macrocode}
\DeclareVrefOptions{italian}
  {\def\reftextfaceafter {\reftextvario{a fronte}%
                           {nella pagina successiva}}%
    \def\reftextfacebefore{\reftextvario{a fronte}%
                           {nella pagina precedente}}%
    \def\reftextafter     {nella pagina \reftextvario{seguente}%
                           {successiva}}%
    \def\reftextbefore    {nella pagina precedente}%
    \def\reftextcurrent   {in questa pagina}%
    \def\reftextfaraway#1{a pagina~\pageref{#1}}%
    \def\reftextpagerange#1#2{nelle pagine~\pageref{#1}--\pageref{#2}}%
    \def\reftextlabelrange#1#2{da~\ref{#1} a~\ref{#2}}%
    \let\vrefformat\vrefdefaultformat
    \let\Vrefformat\Vrefdefaultformat
    \let\fullrefformat\fullrefdefaultformat
    \let\vrefrangeformat\vrefrangedefaultformat
  }
%    \end{macrocode}
%    Defaults for Japanese. It needs a special \cs{vrefformat},
%    \cs{Vrefformat}, \cs{fullrefformat} and \cs{vrefrangeformat}
%    for grammatical reasons. As our standard documentation
%    workflow uses pdf\TeX{} the Japanese letters can't be displayed
%    easily, so you will see missing glyphs below. To see the real
%    letters you have to look at the source or package file.
% \changes{v1.6d}{2020/07/20}{Option japanese added (gh/352)}
% \changes{v1.6e}{2020/07/25}{Option japanese changed (gh/352)}
% \begin{allowtofu}
%    \begin{macrocode}
\DeclareVrefOptions{japanese}
  {\def\reftextfaceafter {\reftextvario{見開き}{次}ページ}%
    \def\reftextfacebefore{\reftextvario{見開き}{前}ページ}%
    \def\reftextafter     {\reftextvario{直後の}{次}ページ}%
    \def\reftextbefore    {\reftextvario{直前の}{前}ページ}%
    \def\reftextcurrent   {\reftextvario{この}{現}ページ}%
    \def\reftextfaraway#1{\pageref{#1}ページ}%
    \def\reftextpagerange#1#2{\pageref{#1}から\pageref{#2}ページ}%
    \def\reftextlabelrange#1#2{\ref{#1}から\ref{#2}}%
%    \end{macrocode}
%    Note that the parentheses below are not normal ones but full width
%    ones U+FF08 and U+FF09!
%    \begin{macrocode}
    \def\vrefformat#1#2{\ref{#2}（\vpageref[#1]{#2}）}%
    \def\Vrefformat#1#2{\Ref{#2}（\vpageref[#1]{#2}）}%
    \def\fullrefformat#1{\ref{#1}（\reftextfaraway{#1}）}%
    \def\vrefrangeformat#1#2#3{\reftextlabelrange{#2}{#3}%
                               （\vpagerefrange[{#1}]{#2}{#3}）}%
  }
%    \end{macrocode}
% \end{allowtofu}
%   Defaults for Hungarian by Jeff Goldberg
%   (\verb=jeffrey@goldmark.org=).
%   There is a problem with the use of the definite article
%   \textit{a} or \textit{az} in Hungarian before expansions
%   of |\vref| or |\ref|.  The problem is that the word
%   should be \textit{az} if the number following would begin with
%   a vowel if spelled out, and \textit{a} if the number would begin
%   with a consonant.
%
%   The option assumes that there is a command |\aza| defined which
%   helps resolving this problem.\footnote{This information is actually quite
%   old but unfortunately never made it into \pkg{varioref}. In case any work
%   has been undertaken to resolve this please inform the author about it.}
% \changes{v1.2a}{1998/08/22}{Added defaults for magyar}
% \changes{v1.4j}{2005/01/22}{Defined \cs{reftextfaceafter} and
%       \cs{reftextfacebefore} instead of \cs{reftextafter} and \cs{reftextbefore}}
% \changes{v1.6h}{2026/01/10}{New defaults as provided by Tibor Tómács (gh/1977)}
%    \begin{macrocode}
\DeclareVrefOptions{hungarian,magyar}
  {\def\reftextafter {a k\"ovetkez\H{o} oldalon}%
   \def\reftextbefore{az el\H{o}z\H{o} oldalon}%
   \def\reftextfaceafter {\reftextvario{a t\'uloldalon}%
                         {a k\"ovetkez\H{o} oldalon}}%
   \def\reftextfacebefore{\reftextvario{a t\'uloldalon}%
                         {az el\H{o}z\H{o} oldalon}}%
   \def\reftextcurrent   {ezen az oldalon}%
   \def\reftextfaraway#1{\az{\pageref{#1}}.~oldalon}%
   \def\reftextpagerange#1#2{\az{\pageref{#1}}--\pageref{#2}.~oldalakon}%
   \def\reftextlabelrange#1#2{\told\ref{#1}+tol{} \ref{#2}-ig}%
   \let\vrefformat\vrefdefaultformat
   \let\Vrefformat\Vrefdefaultformat
   \let\fullrefformat\fullrefdefaultformat
   \let\vrefrangeformat\vrefrangedefaultformat
}
%    \end{macrocode}
%
%    The |\AtBeginDocument| needs to be executed when the option is
%    processed and not inside the babel interface.
% \changes{v1.4i}{2004/02/27}{Moved \cs{AtBeginDocument}}
%    \begin{macrocode}
   \AtBeginDocument{\providecommand\aza[1]{a/az%
       \PackageError{varioref}{%
         Proper definition for command \noexpand\aza missing}%
        {You need to (re)define the command \noexpand\aza that
         takes one argument (a number or a \noexpand\pageref command)
         and produces the string `a' or `az' depending on the argument
         value. It should also accept an optional argument (default `l')
         to denote whether or not the string should be lowercase or
         uppercase.}}%
  }
%    \end{macrocode}
%    The Norwegian and `nynorsk' translations have been provided by
%    Dag F Langmyhr \verb=<dag@ifi.uio.no>= and Karl Ove Hufthammer
%    \verb=<huftis@bigfoot.com>=.
% \changes{v1.0q}{1995/04/06}{Added defaults for norsk}
% \changes{v1.0q}{1995/04/06}{Added defaults for nynorsk}
% \changes{v1.2a}{1998/08/22}{Updated defaults for norsk}
% \changes{v1.2a}{1998/08/22}{Updated defaults for nynorsk}
% \changes{v1.2a}{1998/08/22}{Added norsk defaults for
%      \cs{reftextpagerange} and \cs{reftextlabelrange}}
% \changes{v1.2a}{1998/08/22}{Added nynorsk defaults for
%      \cs{reftextpagerange} and \cs{reftextlabelrange}}
% \changes{v1.2i}{2001/01/12}{Updated nynorsk defaults}
%    \begin{macrocode}
\DeclareVrefOptions{norsk}
  {\def\reftextfaceafter {p\aa{} neste side}%
    \def\reftextfacebefore{p\aa{} forrige side}%
    \def\reftextafter     {p\aa{} neste side}%
    \def\reftextbefore    {p\aa{} forrige side}%
    \def\reftextcurrent   {p\aa{} denne siden}%
    \def\reftextfaraway#1{p\aa{} side~\pageref{#1}}%
    \def\reftextpagerange#1#2{p\aa{} side~\pageref{#1}--\pageref{#2}}%
    \def\reftextlabelrange#1#2{\ref{#1} til~\ref{#2}}%
    \let\vrefformat\vrefdefaultformat
    \let\Vrefformat\Vrefdefaultformat
    \let\fullrefformat\fullrefdefaultformat
    \let\vrefrangeformat\vrefrangedefaultformat
  }
\DeclareVrefOptions{nynorsk}
  {\def\reftextfaceafter {p\aa{} neste side}%
    \def\reftextfacebefore{p\aa{} f\o{}rre side}%
    \def\reftextafter     {p\aa{} neste side}%
    \def\reftextbefore    {p\aa{} f\o{}rre side}%
    \def\reftextcurrent   {p\aa{} denne sida}%
    \def\reftextfaraway#1{p\aa{} side~\pageref{#1}}%
    \def\reftextpagerange#1#2{p\aa{} side~\pageref{#1}--\pageref{#2}}%
    \def\reftextlabelrange#1#2{\ref{#1} til~\ref{#2}}%
    \let\vrefformat\vrefdefaultformat
    \let\Vrefformat\Vrefdefaultformat
    \let\fullrefformat\fullrefdefaultformat
    \let\vrefrangeformat\vrefrangedefaultformat
  }
%    \end{macrocode}
%    The polish translations have been provided by
%    Tomasz Michniewski \\
%    \verb=<tomekm@ias.wat.waw.pl>=.
%    The use of the command \verb=\eob= and \verb=aob= etc.\
%    requires appropriate definitions as provided, for example, by
%    the babel system. This should probably be handled differently
%    but it would require modifications in babel's language support.
% \changes{v1.1d}{1997/12/06}{Added defaults for polish}
% \changes{v1.2a}{1998/08/22}{Added polish defaults for
%      \cs{reftextpagerange} and \cs{reftextlabelrange}}
% \changes{v1.4n}{2005/09/14}{Changed default for \cs{reftextfaraway}}
%    \begin{macrocode}
\DeclareVrefOptions{polish}
  {\def\reftextfaceafter {na \reftextvario{s\aob{}siedniej}%
                                   {nast\eob{}pnej} stronie}%
    \def\reftextfacebefore{na \reftextvario{s\aob{}siedniej}%
                                   {poprzedniej} stronie}%
    \def\reftextafter     {na nast\eob{}pnej stronie}%
    \def\reftextbefore    {na poprzedniej stronie}%
    \def\reftextcurrent   {na \reftextvario{tej
                           samej}{bie\zkb{}\aob{}cej} stronie}%
    \def\reftextfaraway#1{na stronie~\pageref{#1}}%
    \def\reftextpagerange#1#2{na stronach~\pageref{#1}--\pageref{#2}}%
    \def\reftextlabelrange#1#2{od~\ref{#1} do~\ref{#2}}%
    \let\vrefformat\vrefdefaultformat
    \let\Vrefformat\Vrefdefaultformat
    \let\fullrefformat\fullrefdefaultformat
    \let\vrefrangeformat\vrefrangedefaultformat
  }
%    \end{macrocode}
%    The Portuges default text has been provided by
%    Jos\'e Carlos Oliveira Santos \verb=jcsantos@fc.up.pt=.
% \changes{v1.2b}{1999/11/25}{Added portuguese defaults}
% \changes{v1.2c}{1999/12/02}{Added more portuguese defaults}
% \changes{v1.4r}{2007/05/26}{Misspelling of \cs{extrasportuges}}
%    \begin{macrocode}
\DeclareVrefOptions{portuges}
  {\def\reftextfaceafter {na \reftextvario{p\'agina ao lado}{pr\'oxima
                           p\'agina}}%
    \def\reftextfacebefore{na p\'agina \reftextvario{ao lado}{anterior}}%
    \def\reftextafter     {na \reftextvario{p\'agina seguinte}{pr\'oxima
                           p\'agina}}%
    \def\reftextbefore{na p\'agina \reftextvario{anterior}{precedente}}%
    \def\reftextcurrent   {nesta p\'agina}%
    \def\reftextfaraway#1{na p\'agina~\pageref{#1}}%
     \def\reftextpagerange#1#2{nas p\'aginas~\pageref{#1}--\pageref{#2}}%
     \def\reftextlabelrange#1#2{\ref{#1} a~\ref{#2}}%
    \let\vrefformat\vrefdefaultformat
    \let\Vrefformat\Vrefdefaultformat
    \let\fullrefformat\fullrefdefaultformat
    \let\vrefrangeformat\vrefrangedefaultformat
  }
%    \end{macrocode}
% Updates to the default text for Romanian have been suggested by Florin Oprina
%  (\verb=<florin.oprina@gmail.com>=).
% \changes{v1.4v}{2009/06/13}{Incorrect text in \cs{reftextafter} (pr/4070)}
% \changes{v1.5a}{2014/07/03}{Correct text in \cs{reftextbefore}}
%    \begin{macrocode}
\DeclareVrefOptions{romanian}
  {\def\reftextfaceafter {pe pagina \reftextvario{opus\u{a}}{urm\u{a}toarei}}%
    \def\reftextfacebefore{pe pagina \reftextvario{opus\u{a}}{precedentei}}%
    \def\reftextafter     {\reftextvario{pe pagina urm\u{a}toare}%
                                        {pe urm\u{a}toarea pagin\u{a}}}%
    \def\reftextbefore    {pe pagina \reftextvario{precedent\u{a}}%
                                                  {precedentei}}%
    \def\reftextcurrent   {pe aceast\u{a} pagin\u{a}}%
    \def\reftextfaraway#1{pe pagina~\pageref{#1}}%
    \def\reftextpagerange#1#2{pe paginile~\pageref{#1}--\pageref{#2}}%
    \def\reftextlabelrange#1#2{\ref{#1} la~\ref{#2}}%
    \let\vrefformat\vrefdefaultformat
    \let\Vrefformat\Vrefdefaultformat
    \let\fullrefformat\fullrefdefaultformat
    \let\vrefrangeformat\vrefrangedefaultformat
  }
%    \end{macrocode}
%    The text for Russian was taken from the book in Russian by
%    I.~A.~Kotelnikov and P.~Z.~Chebotaev, and adapted
%    to the encoding-independent form by Vladimir Volovich
%    (\verb=vvv@vsu.ru=).
% \changes{v1.2a}{1998/11/23}{Added russian strings}
% \changes{v1.2a}{1998/11/24}{Added defaults for
%      \cs{reftextpagerange} and \cs{reftextlabelrange}}
%    \begin{macrocode}
\DeclareVrefOptions{russian}
  {\def\reftextfaceafter{\cyrn\cyra\ \reftextvario{\cyrp\cyrr\cyro
      \cyrt\cyri\cyrv\cyro\cyrp\cyro\cyrl\cyro\cyrzh\cyrn\cyro\cyrishrt}%
      {\cyrs\cyrl\cyre\cyrd\cyru\cyryu\cyrshch\cyre\cyrishrt}\ \cyrs\cyrt
      \cyrr\cyra\cyrn\cyri\cyrc\cyre}%
    \def\reftextfacebefore{\cyrn\cyra\ \reftextvario{\cyrp\cyrr\cyro
      \cyrt\cyri\cyrv\cyro\cyrp\cyro\cyrl\cyro\cyrzh\cyrn\cyro\cyrishrt}%
      {\cyrp\cyrr\cyre\cyrd\cyrery\cyrd\cyru\cyrshch\cyre\cyrishrt}\
      \cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyre}%
    \def\reftextafter{\cyrn\cyra\ \cyrs\cyrl\cyre\cyrd\cyru\cyryu\cyrshch
      \cyre\cyrishrt\ \cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyre}%
    \def\reftextbefore{\cyrn\cyra\ \reftextvario{\cyrp\cyrr\cyre\cyrd
      \cyrsh\cyre\cyrs\cyrt\cyrv\cyru\cyryu\cyrshch\cyre\cyrishrt}%
      {\cyrp\cyrr\cyre\cyrd\cyrery\cyrd\cyru\cyrshch\cyre\cyrishrt}%
      \ \cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyre}%
    \def\reftextcurrent{\cyrn\cyra\ \reftextvario{\cyrerev\cyrt\cyro
      \cyrishrt}{\cyrd\cyra\cyrn\cyrn\cyro\cyrishrt}\ \cyrs\cyrt\cyrr
      \cyra\cyrn\cyri\cyrc\cyre}%
    \def\reftextfaraway#1{\cyrn\cyra\ \cyrs.~\pageref{#1}}%
    \def\reftextpagerange#1#2{\cyrn\cyra\ \cyrs\cyrt\cyrr\cyra\cyrn
      \cyri\cyrc\cyra\cyrh~\pageref{#1}--\pageref{#2}}%
    \def\reftextlabelrange#1#2{\cyrs~\ref{#1}\ \cyrp\cyro~\ref{#2}}%
    \let\vrefformat\vrefdefaultformat
    \let\Vrefformat\Vrefdefaultformat
    \let\fullrefformat\fullrefdefaultformat
    \let\vrefrangeformat\vrefrangedefaultformat
  }
%    \end{macrocode}
%    The text for Slovak defaults was contributed by Miroslav Sedivy\\
%    (\verb=<miro@slovensko.com>=).
% \changes{v1.4b}{2002/03/11}{Contributed defaults added}
%    \begin{macrocode}
\DeclareVrefOptions{slovak}
  {\def\reftextfaceafter {na \reftextvario{proti\v lahlej}%
                          {nasleduj\'ucej} strane}%
    \def\reftextfacebefore{na \reftextvario{proti\v lahlej}%
                          {predch\'adzaj\'ucej} strane}%
    \def\reftextafter     {na \reftextvario{nasleduj\'ucej}%
                          {\v dal\v sej} strane}%
    \def\reftextbefore    {na \reftextvario{predch\'adzaj\'ucej}%
                          {predo\v slej} strane}%
    \def\reftextcurrent   {na tejto strane}%
    \def\reftextfaraway#1{na strane~\pageref{#1}}%
    \def\reftextpagerange#1#2{na stran\'ach~\pageref{#1}--\pageref{#2}}%
    \def\reftextlabelrange#1#2{\ref{#1} a\v z~\ref{#2}}%
    \let\vrefformat\vrefdefaultformat
    \let\Vrefformat\Vrefdefaultformat
    \let\fullrefformat\fullrefdefaultformat
    \let\vrefrangeformat\vrefrangedefaultformat
  }
%    \end{macrocode}
%    The text for Slovene defaults was contributed by Roman Maurer\\
%    (\verb=<roman.maurer@amis.net>=).
% \changes{v1.4a}{2002/03/05}{Contributed defaults added}
%    \begin{macrocode}
\DeclareVrefOptions{slovene}
  {\def\reftextfaceafter {na naslednji strani}%
    \def\reftextfacebefore{na prej\v{s}nji strani}%
    \let\reftextafter     \reftextfaceafter
    \let\reftextbefore    \reftextfacebefore
    \def\reftextcurrent   {na \reftextvario{tej}{trenutni} strani}%
    \def\reftextfaraway#1{na strani~\pageref{#1}}%
    \def\reftextpagerange#1#2{na straneh~\pageref{#1}--\pageref{#2}}%
    \def\reftextlabelrange#1#2{od~\ref{#1} do~\ref{#2}}%
    \let\vrefformat\vrefdefaultformat
    \let\Vrefformat\Vrefdefaultformat
    \let\fullrefformat\fullrefdefaultformat
    \let\vrefrangeformat\vrefrangedefaultformat
  }
%    \end{macrocode}
%    Text for Spanish defaults was contributed by Julio Sanchez
%    (\verb=jsanchez@gmv.es=) and Fernando Dobladez (\verb=<ferd@fuego.com>=).
% \changes{v1.0f}{1994/03/16}{Inserted missing hash mark}
% \changes{v1.0k}{1994/06/05}{Corrected misspelled cmd `extrasspanish}
% \changes{v1.4a}{2002/03/05}{Missing defaults added}
% \changes{v1.4o}{2005/11/26}{Single hyphen in range}
%    \begin{macrocode}
\DeclareVrefOptions{spanish}
  {\def\reftextfaceafter {en la p\'agina siguiente}%
    \def\reftextfacebefore{en la p\'agina anterior}%
    \let\reftextafter     \reftextfaceafter
    \let\reftextbefore    \reftextfacebefore
    \def\reftextcurrent   {en esta p\'agina}%
    \def\reftextfaraway#1{en la p\'agina~\pageref{#1}}%
    \def\reftextpagerange#1#2{en las p\'aginas~\pageref{#1}%
                                             -\pageref{#2}}%
    \def\reftextlabelrange#1#2{\ref{#1} a~\ref{#2}}%
    \let\vrefformat\vrefdefaultformat
    \let\Vrefformat\Vrefdefaultformat
    \let\fullrefformat\fullrefdefaultformat
    \let\vrefrangeformat\vrefrangedefaultformat
  }
%    \end{macrocode}
%    The text for Swedish was contributed by Mats Dahlgren
%    (\verb=matsd@sssk.se=).
% \changes{v1.0p}{1995/01/10}{Added swedish strings}
% \changes{v1.2a}{1998/08/22}{Added swedish defaults for
%      \cs{reftextpagerange} and \cs{reftextlabelrange}}
%    \begin{macrocode}
\DeclareVrefOptions{swedish}
  {\def\reftextfaceafter {p\aa\ \reftextvario{motst\aa ende}%
                                             {n\"{a}sta} sida}%
     \def\reftextfacebefore{p\aa\ \reftextvario{motst\aa ende}%
                                      {f\"{o}reg\aa ende} sida}%
     \def\reftextafter     {p\aa\ \reftextvario{f\"{o}ljande}%
                                            {n\"{a}sta} sida}%
     \def\reftextbefore    {p\aa\ f\"{o}reg\aa ende sida}%
     \def\reftextcurrent   {p\aa\ denna sida}%
     \def\reftextfaraway#1{p\aa\ sidan~\pageref{#1}}%
     \def\reftextpagerange#1#2{p\aa\
                               sidorna~\pageref{#1}--\pageref{#2}}%
     \def\reftextlabelrange#1#2{\ref{#1} till~\ref{#2}}%
    \let\vrefformat\vrefdefaultformat
    \let\Vrefformat\Vrefdefaultformat
    \let\fullrefformat\fullrefdefaultformat
    \let\vrefrangeformat\vrefrangedefaultformat
  }
%    \end{macrocode}
%
%    \begin{macrocode}
\DeclareOption{turkish}
  {\vref@excuse{turkish}%
   \vref@addto\extrasturkish{%
    \def\reftextfaceafter {on the \reftextvario{facing}{next} page}%
    \def\reftextfacebefore{on the \reftextvario{facing}{preceding}
                           page}%
    \def\reftextafter     {on the \reftextvario{following}{next} page}%
    \def\reftextbefore    {on the \reftextvario{preceding}{previous} page}%
    \def\reftextcurrent   {on \reftextvario{this}{the current} page}%
    \def\reftextfaraway#1{on page~\pageref{#1}}%
    \def\reftextpagerange#1#2{on pages~\pageref{#1}--\pageref{#2}}%
    \def\reftextlabelrange#1#2{\ref{#1} to~\ref{#2}}%
    \let\vrefrangeformat\vrefrangedefaultformat
  }}
%    \end{macrocode}
%    The text for Ukrainian defaults was contributed by Mykola Lyakhovych\\
%    (\verb=<lyakhovych@mail.ru>=).
% \changes{v1.4l}{2005/04/24}{Contributed defaults added}
%    \begin{macrocode}
\DeclareVrefOptions{ukrainian}
   {\def\reftextfaceafter{\cyrn\cyra\ \reftextvario{\cyrp\cyrr\cyro
       \cyrt\cyri\cyrl\cyre\cyrzh\cyrn\cyrii\cyrishrt}%
       {\cyrn\cyra\cyrs\cyrt\cyru\cyrp\cyrn\cyrii\cyrishrt}\ \cyrs\cyrt
       \cyro\cyrr\cyri\cyrn\cyrc\cyrii}%
     \def\reftextfacebefore{\cyrn\cyra\ \reftextvario{\cyrp\cyrr\cyro
       \cyrt\cyri\cyrl\cyre\cyrzh\cyrn\cyrii\cyrishrt}%
       {\cyrp\cyro\cyrp\cyre\cyrr\cyre\cyrd\cyrn\cyrii\cyrishrt}\
       \cyrs\cyrt\cyro\cyrr\cyrii\cyrn\cyrc\cyrii}%
     \def\reftextafter{\cyrn\cyra\ \cyrn\cyra\cyrs\cyrt\cyru\cyrp\cyrn
       \cyrii\cyrishrt\ \cyrs\cyrt\cyro\cyrr\cyrii\cyrn\cyrc\cyrii}%
     \def\reftextbefore{\cyrn\cyra\ \cyrp\cyro\cyrp\cyre\cyrr\cyre\cyrd
       \cyrn\cyrii\cyrishrt\ \cyrs\cyrt\cyro\cyrr\cyrii\cyrn\cyrc\cyrii}%
     \def\reftextcurrent{\cyrn\cyra\ \reftextvario{\cyrc\cyrii\cyrishrt}%
       {\cyrd\cyra\cyrn\cyrii\cyrishrt}\ \cyrs\cyrt\cyro\cyrr\cyrii\cyrn
       \cyrc\cyrii}%
     \def\reftextfaraway#1{\cyrn\cyra\ \cyrs.~\pageref{#1}}%
     \def\reftextpagerange#1#2{\cyrn\cyra\ \cyrs\cyrt\cyro\cyrr\cyrii
       \cyrn\cyrk\cyra\cyrh~\pageref{#1}--\pageref{#2}}%
     \def\reftextlabelrange#1#2{\cyrz~\ref{#1}\ \cyrd\cyro~\ref{#2}}%
    \let\vrefformat\vrefdefaultformat
    \let\Vrefformat\Vrefdefaultformat
    \let\fullrefformat\fullrefdefaultformat
    \let\vrefrangeformat\vrefrangedefaultformat
   }
%    \end{macrocode}
%    We support francais as an alternative to french since people
%    might be used to it, but we discourage it.
%    \begin{macrocode}
\DeclareOption{francais}{%
   \typeout{Please use `french' instead of `francais'}%
   \ExecuteOptions{french}}
\DeclareOption{germanb}{%
   \typeout{Please use `german' instead of `germanb'}%
   \ExecuteOptions{german}}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%
%    During document preparation errors due to |\vref| are usually of
%    not much interest. For this reason the draft option turns them into
%    warnings by issuing a |\vrefwarning| command. The final option
%    (default) stops with an error message when varioref detects a possible
%    loop.
% \changes{v1.1h}{1998/08/01}{Added draft and final options}
%    \begin{macrocode}
\DeclareOption{draft}{\AtEndOfPackage\vrefwarning}
\DeclareOption{final}{\AtEndOfPackage\vrefshowerrors} % the default
%    \end{macrocode}
%
%
%    Whether or not \pkg{varioref} uses its own white space and
%    removes the one in the source document is handled by the
%    following two options. For historical reasons the default is to
%    handle the space, but the recommendation these days is to use
%    \texttt{nospace}.
% \changes{v1.6a}{2019/08/25}{Provide options \texttt{space} and \texttt{nospace}}
%    \begin{macrocode}
\newif\if@vrefhandlespace
\DeclareOption{space}  {\@vrefhandlespacetrue}
\DeclareOption{nospace}{\@vrefhandlespacefalse}
%    \end{macrocode}
%
%
%
%
%    After all options are declared we execute the default option
%    \texttt{english} to set up the defaults and then call
%    |\ProcessOptions*| to handle any option passed to the package.
%    The star form is used since we want to execute the options in the
%    order they are given (in case this isn't used together with the
%    \pkg{babel} package).
%    \begin{macrocode}
\ExecuteOptions{english,final,space}
%    \end{macrocode}
%
%
% \subsection{Defining the main macros}
%
% \begin{macro}{\vr@cnt}
%    To generate new labels we use a counter and construct the
%    internal label names by prefixing the current counter value with
%    the string |vr@|. We need a \LaTeX{} counter to get |\include|s
%    handled correctly.
% \changes{v0.1e}{1992/11/15}{use LaTeX counter}
%    \begin{macrocode}
\newcounter{vrcnt}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\vpageref}
% \changes{v1.3a}{2001/04/12}{Scan for star form}
% \begin{macro}{\vp@geref}
%    The command |\vpageref| generates the appropriate string by first
%    parsing the optional arguments (if any) and then compares the
%    internal and the user label.  This command should be robust since
%    the user might put it anywhere.
%
%    We now start by scanning for a star and then call either
%    |\vp@gerefstar| or |\vp@geref|.
%    The space handling logic is a bit twisted these days: if the
%    option \texttt{space} is
%    in force then preceding spaces in the document are removed and
%    the star means that the command should not add its own
%    space. However, with option \texttt{nospace} any space already in the
%    source will be left alone and the command doesn't add its own
%    space either. Thus in this case the star form doesn't
%    have any effect and below |\vp@gerefstar| is let to
%    |\vp@geref|. This allows a package like \pkg{hyperef} to redefine
%    it and use it for its own tasks (like denoting that no link should
%    be produced).
%    \begin{macrocode}
\DeclareRobustCommand\vpageref{\@ifstar
     {\let\vref@maybe@space\@empty\vp@gerefstar}%
     {\let\vref@maybe@space\space \vp@geref}}
%    \end{macrocode}
%
%    \begin{macrocode}
\def\vp@geref{\@ifnextchar[%
%    \end{macrocode}
%    The default for the first optional argument is the string hidden
%    in the macro |\reftextcurrent|.
%    \begin{macrocode}
  \@vpageref{\@vpageref[\reftextcurrent]}%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\vref@space}
% \begin{macro}{\vref@maybe@space}
% \changes{v1.4a}{2002/03/06}{Default added}
%    A default for |\vref@space|. This isn't really needed except in
%    the case that somebody has hooked into the \pkg{varioref}
%    interfaces at a lower level (which isn't really supported,
%    but\ldots). So giving a default will prevent an error message in
%    that case (and should hopefully produce the same behavior as before).
% \changes{v1.6c}{2019/11/05}{Support (mis)use of internal interface by
%                             fancyref (sx/515106)}
%    \begin{macrocode}
\let\vref@space\space
\let\vref@maybe@space\space
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@vpageref}
%    More parsing\ldots
%    \begin{macrocode}
\def\@vpageref[#1]{\@ifnextchar[%
%    \end{macrocode}
%    By default the second optional argument is empty.
% \changes{v1.0h}{1994/06/11}{Pass first argument in both cases}
% \changes{v1.0i}{1994/06/20}{Do it correctly}
% \changes{v1.6a}{2019/08/25}{Default for optional argument changed}
%    \begin{macrocode}
  {\@@vpageref{#1}}{\@@vpageref{#1}[]}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@vpageref}
%     The |\@@vpageref| macro finally generates the references by
%    comparing the value of an internal label with the value of the
%    user label.
% \changes{v1.0h}{1994/06/11}{Change internal interface}
%    \begin{macrocode}
\def\@@vpageref#1[#2]#3{%
%    \end{macrocode}
%    First it switches to horizontal mode if necessary. If there was a
%    preceding space we remember its size in |\@tempskipa| and then remove it for
%    reinsertion later.
% \changes{v1.6a}{2019/08/25}{Don't drop a preceding space completely
%     but reinsert it later after setting a label}
%    \begin{macrocode}
  \leavevmode
  \@tempskipa\lastskip \unskip
%    \end{macrocode}
%    Then it advances the counter |\c@vrcnt| by one which is used to
%    generate internal label names.
%    \begin{macrocode}
  \global\advance\c@vrcnt\@ne
%    \end{macrocode}
%    Then it checks if for the current value of |\c@vrcnt| a label
%    command was issued in the last run. If not it pretends that there
%    was one with the value |{??}{??}|.  Thereafter it stores the
%    pageref value for this label in the macro |\@tempa|.
%    \begin{macrocode}
  \vref@pagenum\@tempa{\the\c@vrcnt @vr}%
%    \end{macrocode}
%    Here we check that the generated text is not going across a page
%    boundary.
% \changes{v0.1f}{1993/01/01}{Add another label to catch cross-overs}
%    \begin{macrocode}
  \vref@pagenum\@tempb{\the\c@vrcnt @xvr}%
%    \end{macrocode}
% \changes{v1.0l}{1994/07/07}{Explicitly expand `label argument for
%                            babel}
%    In version 1.0l the label string has been turned around so that
%    the number comes first. This was done to allow easy explicit
%    expansion of the number before it is passed to the |\label|
%    command. In the babel system the argument of |label| was not
%    expanded with the result that wrong label strings have been
%    generated. This is a general problem that might need a completely
%    different solution in babel but for now the change below (and in
%    some other places in the code) should solve the problem for this
%    special combination of packages.
%
%    These days we actually use |\vref@label| instead of |\label| as
%    this avoids problems with Babel or \pkg{amsmath} redefining
%    the latter command.
% \changes{v1.4e}{2003/01/08}{Use \cs{vref@label} instead of
%    \cs{label} (pr/3489)}
%    \begin{macrocode}
  \vref@label{\the\c@vrcnt @xvr}%
%    \end{macrocode}
%    Since we have removed
%    any leading space above we now insert a space here after the
%    label. It is done here so that it is still visible from following
%    code---the space before the label would be hidden.
%    What kind of space depends on the options to the
%    package. If \texttt{space} was specified, we insert our own
%    space, namely |\vref@maybe@space|. This will typeset a space
%    unless the star form of the current command was used.
%    \begin{macrocode}
  \if@vrefhandlespace
    \vref@maybe@space
  \else
%    \end{macrocode}
%    But if \texttt{nospace} is in force we simply use the same space
%    value that was used in the source document (unless that was zero
%    or non-existent).
%    \begin{macrocode}
    \ifdim\@tempskipa=\z@ \else
      \hskip\@tempskipa
    \fi
  \fi
%    \end{macrocode}
% \changes{v1.1g}{1998/05/10}{Test if inside AMS display (pr2175)}
%    Inside displays of the \pkg{amsmath} package the |\label| command
%    is redefined which makes the test for loops incorrect if a |\vref|
%    is used in, say, |\intertext|. So we test this condition first and
%    only do the test if |\label| doesn't have a special meaning.
%    [This is no longer necessary as |\label| isn't used any more]
%    \begin{macrocode}
%  \ifx\label\label@in@display\else
  \ifx\@tempa\@tempb
    \let\vref@may@loop\relax
  \else
%    \end{macrocode}
%    If both points do not fall onto the same page with either issue
%    an error or a warning message.
%    However, we do no longer issue that warning now but wait until we
%    are sure that both labels aren't ``far away'' because in that
%    case it doesn't matter. So we just save that info in a macro now.
% \changes{v1.0g}{1994/05/27}{Looping pages shown in wrong order}
% \changes{v1.5c}{2016/02/16}{Delay generating the looping warning
%                until we know more}
%    \begin{macrocode}
    \edef\vref@may@loop{%
      \noexpand\vref@err{\noexpand\vref or \noexpand\vpageref
              at page boundary
              \@tempb-\@tempa\space (may loop)%
              }%
      }%
   \fi
%  \fi
%    \end{macrocode}
%    Same game for the user requested label; this time the page
%    reference is saved in |\thevpagerefnum|.
% \changes{v1.4c}{2002/06/14}{Use \cs{thevpagerefnum} instead of \cs{@tempb}}
%    \begin{macrocode}
  \vrefpagenum\thevpagerefnum{#3}%
%    \end{macrocode}
%    Now after the internal label has served its purpose it would be
%    nice to free the memory it occupies by using something like
%    \begin{verbatim}
% \global\expandafter\let
%        \csname r@\the\c@vrcnt @vr\endcsname\@empty
%\end{verbatim}
%    But this is not possible because it would result in getting
%    `Labels may have changed\ldots' warnings for every run.  Now we
%    are ready to produce the textual strings.
%    \begin{macrocode}
  \ifx\@tempa\thevpagerefnum
%    \end{macrocode}
%    If they are the same we insert the first argument into the input
%    stream.  Otherwise we insert the second argument.  Recall that
%    those are the two optional arguments of |...|. However, if the
%    user explicitly requested an empty text string using the optional
%    argument we cancel any preceding space since in this case we are
%    otherwise likely to end up with spaces one before and one after
%    |\vpageref|.
% \changes{v1.2f}{2000/07/07}{Don't output space if optional argument
%    empty (pr/3230)}
%    \begin{macrocode}
    \def\@tempc{#1}%
    \ifx\@tempc\@empty
       \unskip
    \else
       #1%
    \fi
  \else
%    \end{macrocode}
%    If |#2| is empty we do nothing, otherwise we insert it followed by
%    a space.
%    \begin{macrocode}
    \def\@tempc{#2}%
    \ifx\@tempc\@empty \else
      #2\vref@space
    \fi
%    \end{macrocode}
%    Now we check if the page number of the referenced object (stored
%    in |\thevpagerefnum|) is a single positive number.
%    \begin{macrocode}
    \is@pos@number\thevpagerefnum
       {%
%    \end{macrocode}
%    If so, we check if the current position (stored in |\@tempa|) is
%    a positive number. If this is the case we assign this number to
%    the counter register |\@tempcnta| and add one to it.
%    \begin{macrocode}
        \is@pos@number\@tempa
         {\@tempcnta\@tempa
          \advance\@tempcnta\@ne
         }%
%    \end{macrocode}
%    If it is not a positive number we assign the largest possible
%    number to |\@tempcnta|, thereby pretending that label and
%    reference are miles away from each other.
%    \begin{macrocode}
         {\@tempcnta\maxdimen}%
%    \end{macrocode}
%    Now we are ready to check if reference and object are on nearby
%    pages. |\thevpagerefnum| will expand to the page number of the object
%    (and we know that this is a number) and |\@tempcnta| is either
%    one higher than the reference page or completely out of bounds.
%    So if both represent the same value then the object lies one page
%    after its reference.
%    \begin{macrocode}
        \ifnum \thevpagerefnum =\@tempcnta
%    \end{macrocode}
%    Thus if the object falls onto an odd page then the reference is
%    on the facing even page (and so we insert |\reftextfaceafter|),
%    otherwise the object can not be seen from the reference (and we
%    insert |\reftextafter|).  Don't be surprised if we are not
%    using |\thevpagerefnum| in the check. Since |\@tempcnta| has the same
%    value it is faster to use the register instead of parsing the
%    macro contents anew.
%    \begin{macrocode}
         \ifodd\@tempcnta
%    \end{macrocode}
%    In fact we are going to use |\reftextfaceafter| only if we are
%    doing two-sided printing, otherwise |\reftextafter| is always
%    used.
%    Since the value of |\if@twoside| is evaluated before reading in
%    packages we could do better (saving some tokens) by defining
%    the current macro depending on this boolean.
%    \begin{macrocode}
           \if@twoside
             \reftextfaceafter
           \else
             \reftextafter
           \fi
         \else
           \reftextafter
         \fi
%    \end{macrocode}
%    If the object is not on the page following the reference we check
%    if it is on the page before the reference. In \LaTeX{} this
%    situation is not too common, for example with floats it normally
%    does not occur, but of course it isn't impossible if you have more
%    than one reference to the same object, or if you have back
%    references to sections, theorems, etc.  To test this we now
%    subtract two from the current value of |\@tempcnta| (which was
%    set to one higher as the reference page number). Note that
%    subtraction is also possible if the value was |\maxdimen| --- we
%    still get something that is much larger than any sensible page
%    number.
%    \begin{macrocode}
        \else
          \advance\@tempcnta-2
%    \end{macrocode}
%    If now |\thevpagerefnum| and |\@tempcnta| have the same value then the
%    object lies one page before the reference.
%    \begin{macrocode}
          \ifnum \thevpagerefnum =\@tempcnta
%    \end{macrocode}
%    Again we have to check for odd or even pages to distinguish
%    between the facing and the non-facing situation.
%    \begin{macrocode}
            \ifodd\@tempcnta
              \reftextbefore
            \else
%    \end{macrocode}
%    Again the |\reftextfacebefore| only if |@twoside| evaluates to
%    true.
%    \begin{macrocode}
              \if@twoside
                \reftextfacebefore
              \else
                \reftextbefore
              \fi
            \fi
%    \end{macrocode}
%    If the above test also returns false then we have object and
%    references on pages which are far away or don't contain simple
%    page numbers. Therefore we generate the |\reftextfaraway| string
%    and drop any possible ``looping warning'' in |\vref@may@loop|.
%    Recall that this is a macro which has the user label as an
%    argument.
%    \begin{macrocode}
          \else
          \let\vref@may@loop\relax % added
          \reftextfaraway{#3}%
          \fi
        \fi
       }%
%    \end{macrocode}
%    We do the same if our first test (that the page with the object
%    has a positive page number) turns out to be false.
%    \begin{macrocode}
       {%
         \let\vref@may@loop\relax %added
         \reftextfaraway{#3}}%
  \fi
%    \end{macrocode}
%    Finally, we generate the internal label so that it can be checked on
%    the next run. This means that we compare the position after the
%    string with the position of the referenced object. There is one
%    thing to note: to conserve space we locally make |\@currentlabel|
%    empty since we are only interested in the page number value of
%    this internal label.
% \changes{v1.0l}{1994/07/07}{Explicitly expand \cs{label} argument for babel}
%
%    These days we actually use |\vref@label| instead of |\label| as
%    this avoids problems with Babel or \pkg{amsmath} redefining
%    the latter command.
% \changes{v1.4e}{2003/01/08}{Use \cs{vref@label} instead of
%    \cs{label}  (pr/3489)}
% \changes{v1.5c}{2016/02/16}{}
%    \begin{macrocode}
   \vref@label{\the\c@vrcnt @vr}%
%    \end{macrocode}
%    Finally we run |\vref@may@loop| which is either |\relax| or generates
%    a ``may loop'' warning or error as appropriate.
%    \begin{macrocode}
   \vref@may@loop
}
%    \end{macrocode}
% \end{macro}
%
%
%  \begin{macro}{\vp@gerefstar}
%    The default code for the star form is identical to the previous
%    macro |\vp@geref|. It only produces a different result because
%    before calling it we set |\vref@maybe@space| to do nothing.
%
%    The \pkg{hyperref} package can then change the meaning of this
%    command to suppress a hyperlink.
%
%    It is also a good way to check if we are running with a new
%    \pkg{varioref} by testing
%\begin{verbatim}
%  \ifdefined\vp@gerefstar
%     ... code for new varioref
%  \else
%    ... code for old varioref
%  \fi
%\end{verbatim}
%
% \changes{v1.6a}{2019/08/25}{Command added to support hyperref better}
%    \begin{macrocode}
\let\vp@gerefstar\vp@geref
%    \end{macrocode}
%  \end{macro}
%
%

%  \begin{macro}{\vref@label}
% \changes{v1.4e}{2003/01/08}{Macro added (pr/3489)}
%    This macro is like |\label| in the kernel but without passing on
%    |\@currentlabel|, ie useful if all we are interested in is the
%    page number. It also has the effect that it is unaffected by
%    \pkg{amsmath} or Babel redefining the |\label| command.
%    \begin{macrocode}
\def\vref@label#1{\@bsphack
  \protected@write\@auxout{}%
         {\string\newlabel{#1}{{}{\thepage}}}%
  \@esphack}
%    \end{macrocode}
% \end{macro}
%
%
%  \begin{macro}{\vpagerefnum}
% \changes{v1.4c}{2002/06/14}{Macro added}
%    This macro allows to define |\reftextafter| and friends to refer
%    to the page number rather than producing a textual reference.
%    \begin{macrocode}
\let\thevpagerefnum\@empty
%    \end{macrocode}
% \end{macro}
%
%
%  \begin{macro}{\vrefwarning}
% \changes{v0.1g}{1993/02/14}{Macro added}
%  \begin{macro}{\vrefshowerrors}
% \changes{v1.1h}{1998/08/01}{Macro added}
%  \begin{macro}{\vref@err}
% \changes{v0.1g}{1993/02/14}{Macro added}
%    When the |\vref| command detects a possible crossing over a page
%    boundary it will call |\vref@err| to generate an error message.
%    During document preparation one can turn such errors into
%    warnings by issuing a |\vrefwarning| declaration.
% \changes{v1.0g}{1993/02/14}{Macro added}
%    \begin{macrocode}
\def\vrefwarning{\def\vref@err{\PackageWarning{varioref}}}
%    \end{macrocode}
%    \begin{macrocode}
\def\vrefshowerrors{\def\vref@err##1{\PackageError{varioref}{##1}%
    {Please check the pages in question. You might need to replace
     the \string\vref\MessageBreak
     or \noexpand\vpageref by a normal \noexpand\(page)ref to
     stop LaTeX running forever.}}}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%
%
% \begin{macro}{\vref}
%    We start by scanning for a star form and then continue in a
%    different macro depending on the result.
% \changes{v1.3a}{2001/04/12}{Scan for star form}
% \changes{v1.6a}{2019/08/25}{Adjusted for new spacing regime}
%    \begin{macrocode}
\DeclareRobustCommand\vref{\@ifstar
   {\vref@star}{\vr@f}}
%    \end{macrocode}
%  \end{macro}



%  \begin{macro}{\vref@star}
%
%    The star form is easy (and just a convenient shortcut), just call
%    |\ref| followed by |\vpageref| and pass the optional argument to
%    the latter. We don't support the second optional argument of
%    |\vpageref|, if that is needed one has to call both commands
%    explicitly.
% \changes{v1.6a}{2019/08/25}{Command added to support hyperref better}
% \changes{v1.6e}{2020/07/25}{Changed for Japanese (gh/352)}
%    \begin{macrocode}
\newcommand\vref@star[1][]{\vrefformat{#1}}
%    \end{macrocode}
%  \end{macro}
%
%
%  \begin{macro}{\vrefformat,\vrefdefaultformat}
%    Japanese needs a different word order in \cs{vref@star} so this
%    is separated out so that it can be changed at the language level.
% \changes{v1.6e}{2020/07/25}{Macro added (gh/352)}
%    \begin{macrocode}
\def\vrefdefaultformat#1#2{% 
  \ref{#2}
  \vpageref[#1]{#2}}
%    \end{macrocode}
%    Most languages need the above definition.
%    \begin{macrocode}
\let\vrefformat\vrefdefaultformat
%    \end{macrocode}
%  \end{macro}

% \begin{macro}{\vr@f}
%    The normal case is a little bit more elaborated \ldots
% \changes{v1.3c}{2001/09/04}{Correct typo in name}
% \changes{v1.6a}{2019/08/25}{Adjusted for new spacing regime}
%    \begin{macrocode}
\def\vr@f{%
  \leavevmode
%    \end{macrocode}
%    If option \texttt{space} is used then we remove a preceding space
%    and add our own unbreakable space instead. Otherwise we don't do
%    any space-handling.
%    \begin{macrocode}
  \if@vrefhandlespace
    \unskip \nobreakspace
  \fi
%    \end{macrocode}
%    The use of |\nobreakspace| or |~| after the |\unskip| means that
%    this command will always produce a normal space while
%    something like |\nobreak\space| will
%    react to settings of |\nonfrenchspacing|.
%    Unfortunately the latter will also act in cases where one really
%    wants a normal space, e.g., in |Fig.~\vref{..}|, resulting in
%    a large extra space after the dot. For this reason the first solution
%    is used.
% \changes{v1.1e}{1998/03/09}{Don't use \cs{nobreakspace} (pr/1866)}
% \changes{v1.2a}{1998/11/27}{Use \cs{nobreakspace} (pr/2909)}
% \changes{v1.2a}{1998/11/27}{Add \cs{leavevmode}}
%
%    After having handled (or not  handled) the spacing we call
%    |\vref@star| to scan the optional arguments and do the rest.
%    If that command has been altered by \pkg{hyperref} then the
%    current one needs altering too and does the argument scanning explicitly.
%    \begin{macrocode}
  \vref@star                    % in hyperref this needs to be explicit
}
%    \end{macrocode}
% \end{macro}
%
%
%  \begin{macro}{\is@pos@number}
%    The utility macro |\is@pos@number| takes three arguments: a
%    string that is tested for being a valid non-negative integer and the
%    actions to be taken in case the test comes out true or false.
%
%    We start by passing the string to the macro |\is@pos@num| after
%    prefixing it with a \texttt{0} and adding a space after it. To have
%    a well-defined ending point we also add |\@nil| at the end.
%\label{isposnumber}
%    \begin{macrocode}
\def\is@pos@number#1{\is@pos@num0#1\space\@nil}
%    \end{macrocode}
%    Now we parse the enlarged string into a counter register.  To get
%    control back after everything that is regarded by \TeX{} as a
%    number is put into that register we assign |\is@pos@num@| to the
%    |\afterassignment| token.  Since the string started with 0, we
%    can be sure that the register assignment will be carried out
%    without an error message.  In case of counter assignments leading
%    zeros are discarded.
%    \begin{macrocode}
\def\is@pos@num{\afterassignment\is@pos@num@ \count@}
%    \end{macrocode}
%    Now we have to check whether or not the whole string was parsed
%    into that register or some remainder was left over. Since we have
%    added a |\@nil| token at the very end we can use that to delimit
%    the argument of |\is@pos@num@|. Note that the added space in
%    |\is@pos@number| \vpageref[above]{isposnumber} gets parsed away
%    by the counter assignment. If it would be missing, and the full
%    string would consist of a number, \TeX{} would try to replace
%    |\@nil| by its definition to see if it would contain additional
%    digits and thus we would be in trouble at this point.
%    \begin{macrocode}
\def\is@pos@num@#1\@nil{%
%    \end{macrocode}
%    Now we have to check if the argument is empty. We can do this
%    with an |\ifx| (i.e., in an expandable way) since we know for
%    sure that it can not start with |\@nil|.
% \changes{v1.4j}{2004/05/08}{Use \cs{@nil} for testing}
%    \begin{macrocode}
  \ifx\@nil#1\@nil
%    \end{macrocode}
%    Depending on the result we execute the second or third argument
%    of the command |\is@pos@number| using a technique that removes
%    the |\else| or |\fi| from the input stream first, so that in
%    principle input stream parsing could be done from within the
%    arguments.
%    \begin{macrocode}
    \expandafter\@firstoftwo \else
    \expandafter\@secondoftwo  \fi}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\reftextvario}
%    This macro gives a little bit of random variation in the text
%    because the outcome depends on the number of |\vref| commands
%    seen before.
%    \begin{macrocode}
\def\reftextvario#1#2{\ifodd\c@vrcnt #1\else#2\fi}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\fullref}
%    And here is the primitive command that always produces a |\ref|
%    and a |\pageref|.
% \changes{v1.6e}{2020/07/25}{Changed for Japanese (gh/352)}
%    \begin{macrocode}
\newcommand\fullref{\fullrefformat}
%    \end{macrocode}
%  \end{macro}
%
%
%  \begin{macro}{\fullrefformat,\fullrefdefaultformat}
%    Japanese needs a different word order in \cs{fullref}  so this
%    is separated out so that it can be changed at the language level.
% \changes{v1.6e}{2020/07/25}{Macro added (gh/352)}
%    \begin{macrocode}
\def\fullrefdefaultformat#1{% 
  \ref{#1} \reftextfaraway{#1}}
%    \end{macrocode}
%    Most languages need the above definition.
%    \begin{macrocode}
\let\fullrefformat\fullrefdefaultformat
%    \end{macrocode}
%  \end{macro}
%
%
% \subsubsection{Supporting ranges}
%
%  \begin{macro}{\vref@pagenum}
% \changes{v1.2a}{1998/08/01}{Macro added}
%    This command takes a label as |#1| extracts the page number
%    associated with it and saves the result in a csname which is
%    passed as |#1|. If the label isn't associated with a page number
%    it essentially associates it with |??| for both the label number
%    and the page, thus defining the label this way.  This means that
%    no label warning is generated for this label in case it is
%    undefined.
% \changes{v1.6f}{2021/07/07}{Use 3 additional (empty) arguments as
%                              default in case nameref is active}
%    \begin{macrocode}
\def\vref@pagenum#1#2{%
  \@ifundefined{r@#2}{\@namedef{r@#2}{{??}{??}{}{}{}}}{}%
%    \end{macrocode}
%    Extracting and saving the page number turned out to be a source of subtle
%    bugs. Initially it was done through an |\edef| with a bunch of
%    |\expandafter| commands inside. This posed a problem if the page number
%    itself contained code which needed protection (e.g., pr/4080) so this got
%    changed to use |\protected@edef|. However, that in turn failed with Babel
%    (pr/4093)
%    if the label contained active characters, e.g., a ``:'' in French. So now
%    we use even more |\expandafter| commands to avoid any expansion other
%    than what is absolutely  required---I'm sure there is now a simpler way
%    to code this, but \ldots\ in fact we didn't use enough initially resulting in another
%    bug (pr/4159):
% \changes{v1.4w}{2009/09/13}{Use \cs{protected@edef} to avoid problems
%              in complicated setups, e.g., microtype (pr/4080)}
% \changes{v1.4y}{2010/11/12}{Avoid even \cs{protected@edef} to pacify french
%    babel (pr/4093)}
% \changes{v1.4z}{2011/10/02}{Previous fix need one more expansion
%                            (pr/4159,pr/4171)}
%    \begin{macrocode}
  \expandafter\expandafter\expandafter\vref@@pagenum
  \csname r@#2\endcsname{}{}\@nil#1%
}
\def\vref@@pagenum#1#2#3\@nil#4{%
  \def#4{#2}%
}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\vrefpagenum}
% \changes{v1.2a}{1998/08/01}{Macro added}
%    Same as the above but this time we generate a warning for
%    undefined labels.
%    \begin{macrocode}
\def\vrefpagenum#1#2{%
  \@ifundefined{r@#2}%
    {\G@refundefinedtrue
     \@latex@warning{Reference `#2' on page \thepage \space
             undefined}}{}%
  \vref@pagenum{#1}{#2}}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\vpagerefrange}
%  \begin{macro}{\@vpagerefrange}
%  \begin{macro}{\@svpagerefrange}
% \changes{v1.2a}{1998/08/01}{Macro added}
% \changes{v1.3b}{2001/04/14}{Scan for star form}
% \changes{v1.4s}{2007/08/07}
%         {Prevent loss of brackets}
%    If both labels refer to the same page then we produce a
%    |\vpageref|. Otherwise we produce the result of
%    |\reftextpagerange|.
%
%    One could think of making this command even more clever by
%    producing a special string if the difference between the two page
%    number is one (but this is not done).
%
%    We need two versions to implement a star form:
%    \begin{macrocode}
\newcommand\@svpagerefrange[3][\reftextcurrent]{%
  \vrefpagenum\@tempa{#2}%
  \vrefpagenum\@tempb{#3}%
  \ifx\@tempa\@tempb
    \vpageref*[{#1}]{#2}%
  \else
    \reftextpagerange{#2}{#3}%
  \fi
}
%    \end{macrocode}
%    And the same but using |\vpageref|:
%    \begin{macrocode}
\newcommand\@vpagerefrange[3][\reftextcurrent]{%
  \vrefpagenum\@tempa{#2}%
  \vrefpagenum\@tempb{#3}%
  \ifx\@tempa\@tempb
    \vpageref[{#1}]{#2}%
  \else
    \reftextpagerange{#2}{#3}%
  \fi
}
%    \end{macrocode}
%    And here we put things together.
%    \begin{macrocode}
\newcommand\vpagerefrange{\@ifstar\@svpagerefrange\@vpagerefrange}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%
%
%  \begin{macro}{\vrefrange}
% \changes{v1.2a}{1998/08/01}{Macro added}
% \changes{v1.4s}{2006/08/07}
%         {Prevent loss of brackets}
% \changes{v1.6d}{2020/07/20}{Changed for Japanese (gh/352)}
%    Argument two and three are implicitly picked up.
%    \begin{macrocode}
\newcommand\vrefrange[1][\reftextcurrent]{\vrefrangeformat{#1}}
%    \end{macrocode}
%    
%  \end{macro}
%
%
%  \begin{macro}{\vrefrangeformat,\vrefrangedefaultformat}
%    Japanese needs a different word order in \cs{vrefrange}  so this
%    is separated out so that it can be changed at the language level.
% \changes{v1.6d}{2020/07/20}{Macro added (gh/352)}
%    \begin{macrocode}
\def\vrefrangedefaultformat#1#2#3{% 
  \reftextlabelrange{#2}{#3} \vpagerefrange[{#1}]{#2}{#3}}
%    \end{macrocode}
%    Most languages need the above definition.
%    \begin{macrocode}
\let\vrefrangeformat\vrefrangedefaultformat
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\Vref}
%  \changes{v1.4a}{2002/02/24}{Macro added}
%    |\Vref| is the counterpart to |\vref| with |\ref| replaced by
%    |\Ref| in its definition.
% \changes{v1.6a}{2019/08/25}{Adjusted for new spacing regime}
%    \begin{macrocode}
\DeclareRobustCommand\Vref{\@ifstar
   {\Vref@star}%
   {\Vr@f}}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\Vref@star}
% \changes{v1.6a}{2019/08/25}{Command added to support hyperref better}
% \changes{v1.6e}{2020/07/25}{Changed for Japanese (gh/352)}
%    \begin{macrocode}
\newcommand\Vref@star[1][]{\Vrefformat{#1}}
%    \end{macrocode}
%  \end{macro}
%
%
%  \begin{macro}{\Vrefformat,\Vrefdefaultformat}
%    Japanese needs a different word order in \cs{Vref}  so this
%    is separated out so that it can be changed at the language level.
% \changes{v1.6e}{2020/07/25}{Macro added (gh/352)}
%    \begin{macrocode}
\def\Vrefdefaultformat#1#2{% 
  \Ref{#2}
  \vpageref[#1]{#2}}
%    \end{macrocode}
%    Most languages need the above definition.
%    \begin{macrocode}
\let\Vrefformat\Vrefdefaultformat
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\Vr@f}
%  \changes{v1.4a}{2002/02/24}{Macro added}
%  \changes{v1.4x}{2010/08/04}{Correct spacing -- same mistake as in \cs{vref}
%                              (pr/4123)}
% \changes{v1.6a}{2019/08/25}{Adjusted for new spacing regime}
%    \begin{macrocode}
\def\Vr@f{%
  \if@vrefhandlespace
    \unskip \vref@space
  \fi
  \Vref@star                  % in hyperref this needs to be explicit
}
%    \end{macrocode}
%  \end{macro}


%  \begin{macro}{\vpagerefcompare}
%
% \changes{v1.6a}{2019/08/25}{Macro added}
%    \begin{macrocode}
\DeclareRobustCommand\vpagerefcompare[2]{%  label1, label2, TRUE, FALSE
  \vrefpagenum\@tempa{#1}%
  \vrefpagenum\@tempb{#2}%
  \ifx\@tempa\@tempb
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
}
%    \end{macrocode}
%  \end{macro}
%
%
%
%  \begin{macro}{\vpagerefnearby}
% \changes{v1.6a}{2019/08/25}{Macro added}
%    Test if |\vpageref| is going to be at most $\pm1$ off from
%    current page.
%    \begin{macrocode}
\DeclareRobustCommand\vpagerefnearby[1]{%  label, TRUE, FALSE
  \leavevmode
  \@tempskipa\lastskip \unskip
  \global\advance\c@vrcnt\tw@    % keep oddness to not disturb \vrefvario
  \vref@label{\the\c@vrcnt @vn}%
  \ifdim\@tempskipa=\z@ \else
    \hskip\@tempskipa
  \fi
  \vref@pagenum\@tempa{\the\c@vrcnt @vn}%
  \is@pos@number\@tempa
      {%
        \vrefpagenum\@tempb{#1}%
        \is@pos@number\@tempb
            {%
              \ifcase\numexpr \@tempa -\@tempb+1\relax
              \or \or \else \expandafter \@thirdofthree \fi
              \@firstoftwo
            }%
            {\@secondoftwo}%
      }%
      {\@secondoftwo}%
}
%    \end{macrocode}
%  \end{macro}
%

%  \begin{macro}{\vpagerefcomparenearby}
% \changes{v1.6a}{2019/08/25}{Macro added}
%    True if the two pages have Arabic page numbers are at most off by
%    one so that |\vpageref| would produce a special string.
%
%    This is in some sense a general version of |\vpagerefnearby| for
%    use in more complex situations. I.e., if you try to determine if
%    a larger set of references would be close to the current page and
%    you use each time |\vpagerefnearby| then you generate a lot of
%    internal labels for the current point. Thus by setting the label
%    yourself you can save processing time and space. On the other
%    hand you have to be careful to place the label into the right
%    place which can be a bit complicated if you look at the
%    definition of |\vpagerefnearby| that does all this automatically
%    for you. This is why the current macro is not discussed in the
%    user interface section as it is really just for package
%    developers.
%    \begin{macrocode}
\DeclareRobustCommand\vpagerefcomparenearby[2]{%  label1, label2, TRUE, FALSE
  \vrefpagenum\@tempa{#1}%
  \is@pos@number\@tempa
      {%
        \vrefpagenum\@tempb{#2}%
        \is@pos@number\@tempb
            {%
              \ifcase\numexpr \@tempa -\@tempb+1\relax
              \or \or \else \expandafter \@thirdofthree \fi
              \@firstoftwo
            }%
            {\@secondoftwo}%
      }%
      {\@secondoftwo}%
}
%    \end{macrocode}
%  \end{macro}

%
%
%  \subsubsection{Compatibility with older \LaTeX{} formats}
%
%
%  \begin{macro}{\labelformat}
%  \begin{macro}{\Ref}
%  \begin{macro}{\refstepcounter}
%    We don't need to define \cs{labelformat} and \cs{Ref} or change the
%    definition of \cs{refstepcounter} any longer because this is now
%    done in the \LaTeX{} kernel. However, if this package is used
%    together with an older kernel, this is not true, so for this
%    special case we keep the definitions.
%    \begin{macrocode}
\ifx\labelformat\@undefined  % assume we are in an older kernel
  \def\labelformat#1{\expandafter\def\csname p@#1\endcsname##1}
  \DeclareRobustCommand\Ref[1]{\protected@edef\@tempa{\ref{#1}}%
     \expandafter\MakeUppercase\@tempa}
  \def\refstepcounter#1{\stepcounter{#1}%
      \protected@edef\@currentlabel
         {\csname p@#1\expandafter\endcsname\csname the#1\endcsname}}
\fi
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%
% \changes{v1.6e}{2020/07/25}{Move to handle
% the language-specific reference formats. (gh/352)}
%    \begin{macrocode}
\ProcessOptions*
%    \end{macrocode}
%
%    \begin{macrocode}
%</package>
%    \end{macrocode}
% \Finale
%
\endinput
