From 40d644a7f9291dfdd04803dd94b79b573b40dfc7 Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Wed, 10 Jul 2024 16:58:34 +0200 Subject: [PATCH] Implement possibility to define citestyle-specific commands with biblatex Not yet used. --- lib/citeengines/biblatex-chicago.citeengine | 3 +- lib/citeengines/biblatex-natbib.citeengine | 3 +- lib/citeengines/biblatex.citeengine | 3 +- lib/doc/Customization.lyx | 92 ++++++++++++++++++++- lib/doc/de/Customization.lyx | 59 ++++++++++++- src/BiblioInfo.cpp | 2 + src/Citation.h | 2 + src/TextClass.cpp | 17 ++-- src/frontends/qt/Menus.cpp | 2 + src/insets/InsetCitation.cpp | 7 ++ 10 files changed, 179 insertions(+), 11 deletions(-) diff --git a/lib/citeengines/biblatex-chicago.citeengine b/lib/citeengines/biblatex-chicago.citeengine index 4f7c730413..dbfc2802eb 100644 --- a/lib/citeengines/biblatex-chicago.citeengine +++ b/lib/citeengines/biblatex-chicago.citeengine @@ -27,8 +27,9 @@ MaxCiteNames 3 # The syntax of the cite command definitions below is: -# LyXName|alias*[][]=latexcmd +# style@LyXName|alias*[][]=latexcmd # +# * style: (Optional) citestyle to which this command is specific. # * LyXName: The LyX name as output in the LyX file. For # portability reasons, we try to use the same # name for same-formatted commands in the diff --git a/lib/citeengines/biblatex-natbib.citeengine b/lib/citeengines/biblatex-natbib.citeengine index c9dd269081..2a3a122f42 100644 --- a/lib/citeengines/biblatex-natbib.citeengine +++ b/lib/citeengines/biblatex-natbib.citeengine @@ -31,8 +31,9 @@ MaxCiteNames 3 # The syntax of the cite command definitions below is: -# LyXName|alias*[][]=latexcmd +# style@LyXName|alias*[][]=latexcmd # +# * style: (Optional) citestyle to which this command is specific. # * LyXName: The LyX name as output in the LyX file. For # portability reasons, we try to use the same # name for same-formatted commands in the diff --git a/lib/citeengines/biblatex.citeengine b/lib/citeengines/biblatex.citeengine index ba8731e5f7..a1530c6ea5 100644 --- a/lib/citeengines/biblatex.citeengine +++ b/lib/citeengines/biblatex.citeengine @@ -27,8 +27,9 @@ MaxCiteNames 3 # The syntax of the cite command definitions below is: -# LyXName|alias*[][]=latexcmd +# style@LyXName|alias*[][]=latexcmd # +# * style: (Optional) citestyle to which this command is specific. # * LyXName: The LyX name as output in the LyX file. For # portability reasons, we try to use the same # name for same-formatted commands in the diff --git a/lib/doc/Customization.lyx b/lib/doc/Customization.lyx index 4e35366c16..ee422b4bff 100644 --- a/lib/doc/Customization.lyx +++ b/lib/doc/Customization.lyx @@ -24603,9 +24603,74 @@ CiteEngine \end_layout \begin_layout LyX-Code + +\change_inserted -712698321 1720623059 +style@ +\change_unchanged LyXName|alias$*[][]=latexcmd \end_layout +\begin_layout Itemize + +\change_inserted -712698321 1720623254 +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1720623079 +style +\change_unchanged + +\end_layout + +\end_inset + +: + If this is given, + the command is specific to this (biblatex) citation style. + E. +\begin_inset space \thinspace{} +\end_inset + +g., + with +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1720623135 +apa@nptextcite +\change_unchanged + +\end_layout + +\end_inset + + a citation command +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1720623254 + +\backslash +nptextcite +\change_unchanged + +\end_layout + +\end_inset + + which is only available with the +\emph on +apa +\emph default + citation style can be defined. +\end_layout + \begin_layout Itemize \begin_inset Flex Code status collapsed @@ -24713,11 +24778,36 @@ latexcmd \end_layout \begin_layout Standard + +\change_inserted -712698321 1720623197 \begin_inset Flex Code status collapsed \begin_layout Plain Layout -Alias + +\change_inserted -712698321 1720623197 +Style +\change_unchanged + +\end_layout + +\end_inset + +, + +\change_unchanged + +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_deleted -712698321 1720623181 +A +\change_inserted -712698321 1720623181 +a +\change_unchanged +lias \end_layout \end_inset diff --git a/lib/doc/de/Customization.lyx b/lib/doc/de/Customization.lyx index 09c9ec8f40..42c3e8fd84 100644 --- a/lib/doc/de/Customization.lyx +++ b/lib/doc/de/Customization.lyx @@ -23456,7 +23456,51 @@ CiteEngine \end_layout \begin_layout LyX-Code -LyXName|alias$*[][]=latexcmd +style@LyXName|alias$*[][]=latexcmd +\end_layout + +\begin_layout Itemize +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout +style +\end_layout + +\end_inset + +: + Wenn dies angegeben wird, + wird der Befehl als spezifisch für einen (Biblatex-)Zitierstil markiert. + Mit +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout +apa@nptextcite +\end_layout + +\end_inset + + können Sie so bspw. + einen Befehl +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\backslash +nptextcite +\end_layout + +\end_inset + + definieren, + der nur mit dem Zitierstil +\emph on +apa +\emph default + verfügbar ist. \end_layout \begin_layout Itemize @@ -23588,7 +23632,18 @@ latexcmd status collapsed \begin_layout Plain Layout -Alias +Style +\end_layout + +\end_inset + +, + +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout +alias \end_layout \end_inset diff --git a/src/BiblioInfo.cpp b/src/BiblioInfo.cpp index 60c29c8f99..01f8d36ffa 100644 --- a/src/BiblioInfo.cpp +++ b/src/BiblioInfo.cpp @@ -1569,6 +1569,8 @@ BiblioInfo::CiteStringMap const BiblioInfo::getCiteStrings( string style; CiteStringMap csm(styles.size()); for (size_t i = 0; i != csm.size(); ++i) { + if (!styles[i].style.empty() && styles[i].style != buf.masterParams().biblatex_citestyle) + continue; style = styles[i].name; csm[i] = make_pair(from_ascii(style), getLabel(keys, buf, style, ci)); } diff --git a/src/Citation.h b/src/Citation.h index 77c6f6f07f..8ed64a7646 100644 --- a/src/Citation.h +++ b/src/Citation.h @@ -43,6 +43,8 @@ public: std::string stardesc; /// Optional tooltip for the starred version std::string startooltip; + /// Style that supports the command + std::string style; /// upper casing author prefixes (van -> Van) bool forceUpperCase; /// starred version (full author list by default) diff --git a/src/TextClass.cpp b/src/TextClass.cpp index 06d7b8453b..eacb41c7cc 100644 --- a/src/TextClass.cpp +++ b/src/TextClass.cpp @@ -1169,15 +1169,16 @@ bool TextClass::readCiteEngine(Lexer & lexrc, ReadType rt, bool const add) /** For portability reasons (between different * cite engines such as natbib and biblatex), * we distinguish between: - * 1. The LyX name as output in the LyX file - * 2. Possible aliases that might fall back to + * 1. The style that features this command + * 2. The LyX name as output in the LyX file + * 3. Possible aliases that might fall back to * the given LyX name in the current engine - * 3. The actual LaTeX command that is output - * (2) and (3) are optional. + * 4. The actual LaTeX command that is output + * (1), (3) and (4) are optional. * Also, the GUI string for the starred version can * be changed * The syntax is: - * LyXName|alias,nextalias*[][]=latexcmd + * style@LyXName|alias,nextalias*[][]=latexcmd */ enum ScanMode { LyXName, @@ -1192,6 +1193,7 @@ bool TextClass::readCiteEngine(Lexer & lexrc, ReadType rt, bool const add) string alias; string latex_cmd; string stardesc; + string style; size_t const n = def.size(); for (size_t i = 0; i != n; ++i) { ichar = def[i]; @@ -1223,6 +1225,11 @@ bool TextClass::readCiteEngine(Lexer & lexrc, ReadType rt, bool const add) lyx_cmd += ichar; } } + // split off style prefix if there + if (contains(lyx_cmd, '@')) { + lyx_cmd = split(lyx_cmd, style, '@'); + cs.style = style; + } cs.name = lyx_cmd; cs.cmd = latex_cmd.empty() ? lyx_cmd : latex_cmd; if (!alias.empty()) { diff --git a/src/frontends/qt/Menus.cpp b/src/frontends/qt/Menus.cpp index a191073935..f1ad6fefc5 100644 --- a/src/frontends/qt/Menus.cpp +++ b/src/frontends/qt/Menus.cpp @@ -1749,6 +1749,8 @@ void MenuDefinition::expandCiteStyles(BufferView const * bv) for (int ii = 1; cit != end; ++cit, ++ii) { docstring label = cit->second; CitationStyle ccs = citeStyleList[ii - 1]; + if (!ccs.style.empty() && ccs.style != bp.biblatex_citestyle) + continue; ccs.forceUpperCase &= force; ccs.hasStarredVersion &= star; addWithStatusCheck(MenuItem(MenuItem::Command, toqstr(label), diff --git a/src/insets/InsetCitation.cpp b/src/insets/InsetCitation.cpp index 5082e112f2..120786245c 100644 --- a/src/insets/InsetCitation.cpp +++ b/src/insets/InsetCitation.cpp @@ -380,6 +380,13 @@ CitationStyle asValidLatexCommand(BufferParams const & bp, string const & input, for (; it != end; ++it) { CitationStyle this_cs = *it; if (this_cs.name == normalized_input) { + if (!this_cs.style.empty() && this_cs.style != bp.biblatex_citestyle) { + // citation not supported with current style + // reset to \cite + normalized_input = "cite"; + it = valid_styles.begin(); + continue; + } cs = *it; break; } -- 2.39.5