The following solutions uses labels to know the page, where a footnote command is executed.
The first executed footnote (\@LTRfootnotetext
or \@RTLfootnotetext
) globally defines the macro \footdir@<absolute page number>
with L
/R
for the rule left or right.
\footnoterule
checks that macro to print the right rule.
\documentclass{article}
\usepackage{zref-abspage}[2010/03/26]
\usepackage{auxhook}
\usepackage{ltxcmds}[2010/11/12]
\usepackage{bidi}
\makeatletter
\newcounter{footdir@label}
\renewcommand*{\thefootdir@label}{footdir@\the\value{footdir@label}}
\newcommand*{\footdir@write}{%
\stepcounter{footdir@label}%
\zref@labelbyprops{\thefootdir@label}{abspage}%
}
\newif\iffootdir@debug
\footdir@debugtrue
\newcommand*{\footdir@debug}[1]{%
\iffootdir@debug
\typeout{[footdir] #1}%
\fi
}
\@ifpackagelater{zref-abspage}{2012/10/27}{%
% this version is not yet released
\newcommand*{\footdir@LeftRightElse}{%
\ltx@ifundefined{footdir@\the\value{zabspage}}{%
\footdir@debug{abspage \the\value{zabspage}: else}%
\ltx@thirdofthree
}{%
\if\csname footdir@\the\value{zabspage}\endcsname L%
\footdir@debug{abspage \the\value{zabspage}: left}%
\expandafter\ltx@firstofthree
\else
\footdir@debug{abspage \the\value{zabspage}: right}%
\expandafter\ltx@secondofthree
\fi
}%
}%
}{%
\providecommand*{\c@zabspage}{\c@abspage}%
\newcommand*{\footdir@LeftRightElse}{%
\footdir@write
\zifrefundefined{\thefootdir@label}{%
\footdir@debug{abspage ??: else}%
\ltx@thirdofthree
}{%
\edef\footdir@abspage{%
\zref@extractdefault{\thefootdir@label}{abspage}{0}%
}%
\ltx@ifundefined{footdir@\footdir@abspage}{%
\footdir@debug{\footdir@abspage: else}%
\ltx@thirdofthree
}{%
\if\csname footdir@\footdir@abspage\endcsname L%
\footdir@debug{\footdir@abspage: left}%
\expandafter\ltx@firstofthree
\else
\footdir@debug{\footdir@abspage: right}%
\expandafter\ltx@secondofthree
\fi
}%
}%
}%
}
\newcommand*{\footdir@fntext}[1]{%
\footdir@write
\zifrefundefined{\thefootdir@label}{%
}{%
\edef\footdir@name{%
footdir@\zref@extractdefault{\thefootdir@label}{abspage}{0}%
}%
\@ifundefined{\footdir@name}{%
\expandafter\gdef\csname\footdir@name\endcsname{#1}%
}{}%
}%
}
\@ifdefinable{\footdir@ORG@RTLfootnotetext}{%
\let\footdir@ORG@RTLfootnotetext\@RTLfootnotetext
\def\@RTLfootnotetext{%
\footdir@fntext{R}%
\footdir@ORG@RTLfootnotetext
}%
}
\@ifdefinable{\footdir@ORG@LTRfootnotetext}{%
\let\footdir@ORG@LTRfootnotetext\@LTRfootnotetext
\def\@LTRfootnotetext{%
\footdir@fntext{L}%
\footdir@ORG@LTRfootnotetext
}%
}
\def\footnoterule{%
\footdir@LeftRightElse
\left@footnoterule
\right@footnoterule
\left@footnoterule
}
\makeatother
\begin{document}
\RTLfootnote{This is a test.}\LTRfootnote{This is a test.}
\newpage
\LTRfootnotetext[3]{This is a test.}\RTLfootnote[4]{This is a footnote.}
\newpage
\beginR
\RTLfootnote{This is a test.}\LTRfootnote{This is a test.}
\endR
\newpage
\beginR
\LTRfootnotetext[3]{This is a test.}\RTLfootnote[4]{This is a footnote.}
\endR
\end{document}
The debug output:
[footdir] abspage 1: right
[1]
[footdir] abspage 2: left
[2]
[footdir] abspage 3: right
[3]
[footdir] abspage 4: left
[4]
Extension for footnotes, split over two pages
\documentclass{article}
\usepackage{lipsum}
\usepackage{zref-abspage}[2010/03/26]
\usepackage{auxhook}
\usepackage{ltxcmds}[2010/11/12]
\usepackage{bidi}
\makeatletter
\newcounter{footdir@label}
\renewcommand*{\thefootdir@label}{footdir@\the\value{footdir@label}}
\newcommand*{\footdir@write}{%
\stepcounter{footdir@label}%
\zref@labelbyprops{\thefootdir@label}{abspage}%
}
\newif\iffootdir@debug
\footdir@debugtrue
\newtoks\footdir@toks
\newcommand*{\footdir@debug}[1]{%
\iffootdir@debug
\typeout{[footdir] #1}%
\fi
}
\@ifpackagelater{zref-abspage}{2012/10/27}{%
\newcommand*{\footdir@LeftRightElse}{%
\ltx@ifundefined{footdir@\the\value{zabspage}}{%
\footdir@debug{abspage \the\value{zabspage}: else}%
\ltx@thirdofthree
}{%
\if\csname footdir@\the\value{zabspage}\endcsname L%
\footdir@debug{abspage \the\value{zabspage}: left}%
\expandafter\ltx@firstofthree
\else
\footdir@debug{abspage \the\value{zabspage}: right}%
\expandafter\ltx@secondofthree
\fi
}%
}%
}{%
\providecommand*{\c@zabspage}{\c@abspage}%
\newcommand*{\footdir@LeftRightElse}{%
\footdir@write
\zifrefundefined{\thefootdir@label}{%
\footdir@debug{abspage ??: else}%
\ltx@thirdofthree
}{%
\edef\footdir@abspage{%
\zref@extractdefault{\thefootdir@label}{abspage}{0}%
}%
\ltx@ifundefined{footdir@\footdir@abspage}{%
\footdir@debug{\footdir@abspage: else}%
\ltx@thirdofthree
}{%
\if\csname footdir@\footdir@abspage\endcsname L%
\footdir@debug{\footdir@abspage: left}%
\expandafter\ltx@firstofthree
\else
\footdir@debug{\footdir@abspage: right}%
\expandafter\ltx@secondofthree
\fi
}%
}%
}%
}
\newcommand*{\footdir@fntext}[1]{%
\zifrefundefined{\thefootdir@label}{%
}{%
\edef\footdir@name{%
footdir@\zref@extractdefault{\thefootdir@label}{abspage}{0}%
}%
\@ifundefined{\footdir@name}{%
\expandafter\gdef\csname\footdir@name\endcsname{#1}%
}{}%
}%
}
\newcommand*{\footdir@temp}[3]{%
\@ifdefinable{#1}{%
\let#1#2%
\renewcommand{#2}[1]{%
\footdir@write
\footdir@fntext{#3}%
\stepcounter{footdir@label}%
\footdir@fntext{#3}%
\footdir@toks{##1}%
\footdir@toks\expandafter{%
\the\expandafter\footdir@toks
\expandafter
\zref@labelbyprops\expandafter{\thefootdir@label}{abspage}%
}%
\expandafter#1\expandafter{\the\footdir@toks}%
}%
}%
}
\footdir@temp\footdir@ORG@RTLfootnotetext\@RTLfootnotetext{R}%
\footdir@temp\footdir@ORG@LTRfootnotetext\@LTRfootnotetext{L}%
\def\footnoterule{%
\footdir@LeftRightElse
\left@footnoterule
\right@footnoterule
\left@footnoterule
}
\makeatother
\begin{document}
\RTLfootnote{This is a test.}\LTRfootnote{This is a test.}
\newpage
\lipsum[1-4]
\LTRfootnotetext[3]{This is a test.}\RTLfootnote[4]{\lipsum[1-2]}
\newpage
Test with split footnote.
\newpage
\beginR
\RTLfootnote{This is a test.}\LTRfootnote{This is a test.}
\endR
\newpage
\beginR
\LTRfootnotetext[3]{This is a test.}\RTLfootnote[4]{This is a footnote.}
\endR
\end{document}
In this example, also the end of a footnote gets a label. If the end of the footnote falls on the next page, then \footdir@<absolute page number>
is defined for that page.
Unsupported is the case, when a footnote split over more than two pages. This is much more complicate, because also the direction of the last footnote must be remembered and the page with the last footnote needs to be found.