[latex3-commits] [latex3/latex2e] develop: use hooks with arguments, WIP (74538842)

github at latex-project.org github at latex-project.org
Wed Jun 7 23:17:18 CEST 2023


Repository : https://github.com/latex3/latex2e
On branch  : develop
Link       : https://github.com/latex3/latex2e/commit/745388427404e71450ac92a5506cdb137013b6c9

>---------------------------------------------------------------

commit 745388427404e71450ac92a5506cdb137013b6c9
Author: Ulrike Fischer <fischer at troubleshooting-tex.de>
Date:   Sat May 27 17:08:46 2023 +0200

    use hooks with arguments, WIP


>---------------------------------------------------------------

745388427404e71450ac92a5506cdb137013b6c9
 required/latex-lab/latex-lab-bib.dtx | 163 ++++++++++++-----------------------
 1 file changed, 57 insertions(+), 106 deletions(-)

diff --git a/required/latex-lab/latex-lab-bib.dtx b/required/latex-lab/latex-lab-bib.dtx
index 20332d1c..92db9399 100644
--- a/required/latex-lab/latex-lab-bib.dtx
+++ b/required/latex-lab/latex-lab-bib.dtx
@@ -119,26 +119,25 @@
 % \end{variable}
 
 %\subsection{Handling the bibliography}
-% \begin{macro}{\lbibitem}
+% \begin{macro}{\@lbibitem}
 % The item command if an optional argument is use. 
 % 
 % We only prepend some code. 
-% If we had already generic hooks with arguments 
-% we could probably use them \ldots
 %    \begin{macrocode}
-\def\@lbibitem[#1]#2{%
+\AddToHookWithArguments{cmd/@lbibitem/before}
+ {
 %    \end{macrocode}
 % we store the target name for the following code.
 %    \begin{macrocode} 
-  \tl_set:Nx\l_@@_bib_target_tl{cite.#2\@extra at b@citeb}
+   \tl_set:Nx\l_@@_bib_target_tl{cite.#2\@extra at b@citeb}
 %    \end{macrocode}
 % The target is added at the begin of the paragraph.
 %    \begin{macrocode}   
-  \AddToHookNext{para/begin}{\makebox[0pt][r]{\MakeLinkTarget*{\l_@@_bib_target_tl}\hspace{\leftmargin}}}
-  \item[\@biblabel{#1}\hfill]\if at filesw
-      {\let\protect\noexpand
-       \immediate
-       \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces}
+   \AddToHookNext{para/begin}
+     {
+       \makebox[0pt][r]{\MakeLinkTarget*{\l_@@_bib_target_tl}\hspace{\leftmargin}}
+     }
+ }
 %    \end{macrocode} 
 % we make a copy to be able to reinstate the definition. This is e.g.
 % currently needed with hyperref.
@@ -148,15 +147,26 @@
 % \end{macro}
 % 
 % \begin{macro}{\@bibitem}
-% Similar for bibitem. 
+% Similar for \cs{@bibitem}. 
 % TODO: If hyperref is loaded we will get a second target from the refstepcounter,
 % but this is ignored for now. 
 %    \begin{macrocode}
-\def\@bibitem#1{
-  \tl_set:Nx\l_@@_bib_target_tl{cite.#1\@extra at b@citeb}%
-  \AddToHookNext{para/begin}{\makebox[0pt][r]{\MakeLinkTarget*{\l_@@_bib_target_tl}\hspace{\leftmargin}}}
-  \item\if at filesw \immediate\write\@auxout
-       {\string\bibcite{#1}{\the\value{\@listctr}}}\fi\ignorespaces}
+\AddToHookWithArguments{cmd/@bibitem/before}
+ {
+%    \end{macrocode}
+% we store the target name for the following code.
+%    \begin{macrocode} 
+   \tl_set:Nx\l_@@_bib_target_tl{cite.#1\@extra at b@citeb}
+%    \end{macrocode}
+% The target is added at the begin of the paragraph.
+%    \begin{macrocode}   
+   \AddToHookNext{para/begin}
+     {
+       \makebox[0pt][r]{\MakeLinkTarget*{\l_@@_bib_target_tl}\hspace{\leftmargin}}
+     }
+ }
+%    \end{macrocode}  
+%    \begin{macrocode}
 \let\@kernel at copy@bibitem\@bibitem           
 %    \end{macrocode}
 % \end{macro}
@@ -176,7 +186,7 @@
 % structure. Even if it looks a bit odd it is now used for many years and so 
 % hopefully compatible with various packages. But differently to hyperref we use
 % the new hooks with arguments.
-% TODO: consider name. Perhaps use the generic names?
+% TODO: consider hook name. Perhaps use the generic names?
 %    \begin{macrocode}
 \NewMirroredHookPairWithArguments{bibcite/before}{bibcite/after}{2}  
 \def\bibcite#1#2{%
@@ -189,7 +199,8 @@
 \let\@kernel at copy@bibcite\bibcite         
 %    \end{macrocode}
 % Now we add the tagging structure.
-% TODO: the ref key should expand its argument directly!
+% TODO: with the next tagpdf version it should no longer be 
+% needed to exand the ref key.
 %    \begin{macrocode}
 \AddToHookWithArguments{bibcite/before}
   {
@@ -211,7 +222,7 @@
  {
 %    \end{macrocode}
 % the next hyperref will allow to suppress the bib patches, but with older
-% versions we muss reinstated them. 
+% versions we reinstate them. 
 %    \begin{macrocode}
    \@ifpackagelater{hyperref}{2023-05-01}{}
     {
@@ -225,105 +236,45 @@
  }
 %    \end{macrocode}
 %
-% \subsection{Natbib support}
-%  natbib offers various hooks that can be used. The main problem is
-%  to coordinate with the hyperref use of the same hooks.
-%  We also have to add something at the begin of \cs{@lbibitem}. 
-%  As generic hooks with arguments aren't available yet, we have to copy the definition
+% \subsection{Natbib and biblatex support}
+%  When hyperref is loaded, both natbib and biblatex use \cs{hyper at natlinkstart}
+%  and \cs{hyper at natlinkend} to handle the links. We can use the generic hooks to 
+%  add the tagging code (and the link code from hyperref). 
+%  If hyperref is not loaded we need to ensure that a target is created nevertheless
+%  and we need to activate in biblatex the tagging code. 
 %  
 %    \begin{macrocode}
-\AddToHook{package/natbib/after}
-  {
-    \def\hyper at natanchorstart#1{\MakeLinkTarget*{#1}}
-    \def\@lbibitem[#1]#2{%
-      \tl_set:Nx\l__tag_bib_target_tl{cite.#2\@extra at b@citeb}
-      \if\relax\@extra at b@citeb\relax\else
-        \@ifundefined{br@#2\@extra at b@citeb}{}{%
-         \@namedef{br@#2}{\@nameuse{br@#2\@extra at b@citeb}}%
-        }%
-      \fi
-      \@ifundefined{b@#2\@extra at b@citeb}{%
-       \def\NAT at num{}%
-      }{%
-       \NAT at parse{#2}%
-      }%
-      \def\NAT at tmp{#1}%
-      \expandafter\let\expandafter\bibitemOpen\csname NAT at b@open@#2\endcsname
-      \expandafter\let\expandafter\bibitemShut\csname NAT at b@shut@#2\endcsname
-      \@ifnum{\NAT at merge>\@ne}{%
-       \NAT at bibitem@first at sw{%
-        \@firstoftwo
-       }{%
-        \@ifundefined{NAT at b*@#2}{%
-         \@firstoftwo
-        }{%
-         \expandafter\def\expandafter\NAT at num\expandafter{\the\c at NAT@ctr}%
-         \@secondoftwo
-        }%
-       }%
-      }{%
-       \@firstoftwo
-      }%
-      {%
-       \global\advance\c at NAT@ctr\@ne
-       \@ifx{\NAT at tmp\@empty}{\@firstoftwo}{%
-        \@secondoftwo
-       }%
-       {%
-        \expandafter\def\expandafter\NAT at num\expandafter{\the\c at NAT@ctr}%
-        \global\NAT at stdbsttrue
-       }{}%
-       \bibitem at fin
-       \item[\hfil\NAT at anchor{#2}{\NAT at num}]%
-       \global\let\NAT at bibitem@first at sw\@secondoftwo
-       \NAT at bibitem@init
-      }%
-      {%
-       \NAT at anchor{#2}{}%
-       \NAT at bibitem@cont
-       \bibitem at fin
-      }%
-      \@ifx{\NAT at tmp\@empty}{%
-        \NAT at wrout{\the\c at NAT@ctr}{}{}{}{#2}%
-      }{%
-        \expandafter\NAT at ifcmd\NAT at tmp(@)(@)\@nil{#2}%
-      }%
-    }%
-%    \end{macrocode}
-% we redefine the hook to use latex hooks.
-%    \begin{macrocode}
-    \NewMirroredHookPairWithArguments{natbib/linkstart}{natbib/linkend}{1}  
-    \renewcommand\hyper at natlinkstart[1]{\UseHookWithArguments{natbib/linkstart}{1}{#1}}
-    \renewcommand\hyper at natlinkend{\UseHookWithArguments{natbib/linkend}{1}{}}
-    \AddToHookWithArguments{natbib/linkstart}
-      {
-         \leavevmode
-         \tag_mc_end_push:
-         \exp_args:Nx\tagstructbegin{tag=Reference,ref=cite.#1\@extra at b@citeb}
-         \tagmcbegin{}
-      } 
-    \AddToHook{natbib/linkend}
-      {  
-       \tag_mc_end:
-       \tagstructend
-       \tag_mc_begin_pop:n{}
-      }
-  }     
+\newcommand\hyper at natlinkstart[1]{}
+\newcommand\hyper at natlinkend{}
+\AddToHookWithArguments{cmd/hyper at natlinkstart/before}
+ {
+   \leavevmode
+   \tag_mc_end_push:
+   \exp_args:Nx\tagstructbegin{tag=Reference,ref=cite.#1\@extra at b@citeb}
+   \tagmcbegin{}
+ }
+\AddToHook{cmd/hyper at natlinkend/after}
+ {
+   \tag_mc_end:
+   \tagstructend
+   \tag_mc_begin_pop:n{}
+ } 
 %    \end{macrocode}
-% if hyperref is loaded we have to repeat the definition
+% if hyperref is loaded we have to revert is definition of the natbib hooks
+% and add his code. TODO: allow to suppress the natbib code in hyperref. 
 % 
 %    \begin{macrocode}
 \AddToHook{package/hyperref/after}
  {
-    \renewcommand\hyper at natlinkstart[1]{\UseHookWithArguments{natbib/linkstart}{1}{#1}}
-    \renewcommand\hyper at natlinkend{\UseHookWithArguments{natbib/linkend}{1}{}}
-    \AddToHookWithArguments{natbib/linkstart}
+    \renewcommand\hyper at natlinkstart[1]{}
+    \renewcommand\hyper at natlinkend{}
+    \AddToHookWithArguments{cmd/hyper at natlinkstart/before}
       {
          \Hy at backout{#1}%
          \hyper at linkstart{cite}{cite.#1}%
          \def\hyper at nat@current{#1}
       } 
-    \AddToHook{natbib/linkend}
+    \AddToHook{cmd/hyper at natlinkend/after}
       {  
        \hyper at linkend
       }





More information about the latex3-commits mailing list.