X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLaTeXFeatures.cpp;h=0216182f27537ff6c619bdbf92de64c4b939bda6;hb=38c2cde0d8695ac5287bae218c4a33a2acf18ef8;hp=92e48293cd28d15d4bf872f5dabef6cb60e5476f;hpb=e30f3d76d2bee0011ceaeb5f0cc221156458cbad;p=lyx.git diff --git a/src/LaTeXFeatures.cpp b/src/LaTeXFeatures.cpp index 92e48293cd..0216182f27 100644 --- a/src/LaTeXFeatures.cpp +++ b/src/LaTeXFeatures.cpp @@ -63,12 +63,7 @@ namespace lyx { //\message{LyX LaTeX Extensions (LLE v0.2) of 11-Jan-1996.} static docstring const lyx_def = from_ascii( - "\\providecommand{\\LyX}{L\\kern-.1667em\\lower.25em\\hbox{Y}\\kern-.125emX\\@}"); - -static docstring const lyx_hyperref_def = from_ascii( - "\\providecommand{\\LyX}{\\texorpdfstring%\n" - " {L\\kern-.1667em\\lower.25em\\hbox{Y}\\kern-.125emX\\@}\n" - " {LyX}}"); + "{%\n L\\kern-.1667em\\lower.25em\\hbox{Y}\\kern-.125emX\\@}"); static docstring const noun_def = from_ascii( "\\newcommand{\\noun}[1]{\\textsc{#1}}"); @@ -200,6 +195,39 @@ static docstring const lyxgreyedout_def = from_ascii( " {\\textcolor{note_fontcolor}\\bgroup\\ignorespaces}\n" " {\\ignorespacesafterend\\egroup}\n"); +static docstring const lyxgreyedout_rtl_def = from_ascii( + "%% The greyedout annotation environment (with RTL support)\n" + "\\NewEnviron{lyxgreyedout}{%\n" + "\\if@rl%\n" + "\\everypar{\\textcolor{note_fontcolor}\\beginL\\ignorespaces}%\n" + "\\BODY\\everypar{\\ignorespacesafterend\\endL}\n" + "\\else%\n" + "\\textcolor{note_fontcolor}\\bgroup\\ignorespaces%\n" + "\\BODY\\ignorespacesafterend\\egroup\n" + "\\fi}\n"); + +static docstring const lyxgreyedout_luartl_def = from_ascii( + "%% The greyedout annotation environment (with RTL support)\n" + "\\NewEnviron{lyxgreyedout}{%\n" + "\\if@RTL%\n" + "\\everypar{\\color{note_fontcolor}\\pardir TRT \\textdir TRT\\ignorespaces}%\n" + "\\BODY\\everypar{\\ignorespacesafterend}\n" + "\\else%\n" + "\\textcolor{note_fontcolor}\\bgroup\\ignorespaces%\n" + "\\BODY\\ignorespacesafterend\\egroup\n" + "\\fi}\n"); + +static docstring const lyxgreyedout_luartl_babel_def = from_ascii( + "%% The greyedout annotation environment (with RTL support)\n" + "\\NewEnviron{lyxgreyedout}{%\n" + "\\if@rl%\n" + "\\everypar{\\color{note_fontcolor}\\pardir TRT \\textdir TRT\\ignorespaces}%\n" + "\\BODY\\everypar{\\ignorespacesafterend}\n" + "\\else%\n" + "\\textcolor{note_fontcolor}\\bgroup\\ignorespaces%\n" + "\\BODY\\ignorespacesafterend\\egroup\n" + "\\fi}\n"); + // We want to omit the file extension for includegraphics, but this does not // work when the filename contains other dots. // Idea from http://www.tex.ac.uk/cgi-bin/texfaq2html?label=unkgrfextn @@ -207,51 +235,156 @@ static docstring const lyxdot_def = from_ascii( "%% A simple dot to overcome graphicx limitations\n" "\\newcommand{\\lyxdot}{.}\n"); -static docstring const changetracking_dvipost_def = from_ascii( - "%% Change tracking with dvipost\n" - "\\dvipostlayout\n" - "\\dvipost{osstart color push Red}\n" - "\\dvipost{osend color pop}\n" - "\\dvipost{cbstart color push Blue}\n" - "\\dvipost{cbend color pop}\n" - "\\DeclareRobustCommand{\\lyxadded}[3]{\\changestart#3\\changeend}\n" - "\\DeclareRobustCommand{\\lyxdeleted}[3]{%\n" - "\\changestart\\overstrikeon#3\\overstrikeoff\\changeend}\n"); +static docstring const changetracking_xcolor_ulem_base_def = from_ascii( + "%% Change tracking with ulem and xcolor: base macros\n" + "\\DeclareRobustCommand{\\mklyxadded}[1]{\\bgroup\\color{lyxadded}{}#1\\egroup}\n" + "\\DeclareRobustCommand{\\mklyxdeleted}[1]{\\bgroup\\color{lyxdeleted}\\mklyxsout{#1}\\egroup}\n" + "\\DeclareRobustCommand{\\mklyxsout}[1]{\\ifx\\\\#1\\else\\sout{#1}\\fi}\n"); static docstring const changetracking_xcolor_ulem_def = from_ascii( - "%% Change tracking with ulem\n" - "\\DeclareRobustCommand{\\lyxadded}[3]{{\\color{lyxadded}{}#3}}\n" - "\\DeclareRobustCommand{\\lyxdeleted}[3]{{\\color{lyxdeleted}\\lyxsout{#3}}}\n" - "\\DeclareRobustCommand{\\lyxsout}[1]{\\ifx\\\\#1\\else\\sout{#1}\\fi}\n"); + "%% Change tracking with ulem and xcolor: ct markup\n" + "\\DeclareRobustCommand{\\lyxadded}[4][]{\\mklyxadded{#4}}\n" + "\\DeclareRobustCommand{\\lyxdeleted}[4][]{\\mklyxdeleted{#4}}\n"); + +static docstring const changetracking_xcolor_ulem_cb_def = from_ascii( + "%% Change tracking with ulem, xcolor and changebars: ct markup\n" + "\\DeclareRobustCommand{\\lyxadded}[4][]{%\n" + " \\protect\\cbstart\\mklyxadded{#4}%\n" + " \\protect\\cbend%\n" + "}\n" + "\\DeclareRobustCommand{\\lyxdeleted}[4][]{%\n" + " \\protect\\cbstart\\mklyxdeleted{#4}%\n" + " \\protect\\cbend%\n" + "}\n"); static docstring const changetracking_xcolor_ulem_hyperref_def = from_ascii( - "%% Change tracking with ulem\n" - "\\DeclareRobustCommand{\\lyxadded}[3]{{\\texorpdfstring{\\color{lyxadded}{}}{}#3}}\n" - "\\DeclareRobustCommand{\\lyxdeleted}[3]{{\\texorpdfstring{\\color{lyxdeleted}\\lyxsout{#3}}{}}}\n" - "\\DeclareRobustCommand{\\lyxsout}[1]{\\ifx\\\\#1\\else\\sout{#1}\\fi}\n"); - -static docstring const changetracking_tikz_math_sout_def = from_ascii( - "%% Strike out display math with tikz\n" - "\\usepackage{tikz}\n" + "%% Change tracking with ulem, xcolor, and hyperref: ct markup\n" + "\\DeclareRobustCommand{\\lyxadded}[4][]{\\texorpdfstring{\\mklyxadded{#4}}{#4}}\n" + "\\DeclareRobustCommand{\\lyxdeleted}[4][]{\\texorpdfstring{\\mklyxdeleted{#4}}{}}\n"); + +static docstring const changetracking_xcolor_ulem_hyperref_cb_def = from_ascii( + "%% Change tracking with ulem, xcolor, hyperref and changebars: ct markup\n" + "\\DeclareRobustCommand{\\lyxadded}[4][]{%\n" + " \\texorpdfstring{\\protect\\cbstart\\mklyxadded{#4}%\n" + " \\protect\\cbend}{#4}%\n" + "}\n" + "\\DeclareRobustCommand{\\lyxdeleted}[4][]{%\n" + " \\texorpdfstring{\\protect\\cbstart\\mklyxdeleted{#4}%\n" + " \\protect\\cbend}{}%\n" + "}\n"); + +static docstring const changetracking_tikz_object_sout_def = from_ascii( + "%% Strike out display math and text objects with tikz\n" "\\usetikzlibrary{calc}\n" - "\\newcommand{\\lyxmathsout}[1]{%\n" - " \\tikz[baseline=(math.base)]{\n" - " \\node[inner sep=0pt,outer sep=0pt](math){#1};\n" - " \\draw($(math.south west)+(2em,.5em)$)--($(math.north east)-(2em,.5em)$);\n" + "\\newcommand{\\lyxobjectsout}[1]{%\n" + " \\bgroup%\n" + " \\color{lyxdeleted}%\n" + " \\tikz{\n" + " \\node[inner sep=0pt,outer sep=0pt](lyxdelobj){#1};\n" + " \\draw($(lyxdelobj.south west)+(2em,.5em)$)--($(lyxdelobj.north east)-(2em,.5em)$);\n" " }\n" + " \\egroup%\n" + "}\n"); + +static docstring const changetracking_xcolor_ulem_object_def = from_ascii( + "%% Change tracking with ulem and xcolor: ct markup for complex objects\n" + "\\DeclareRobustCommand{\\lyxobjdeleted}[4][]{\\lyxobjectsout{#4}}\n" + "\\DeclareRobustCommand{\\lyxdisplayobjdeleted}[4][]{%\n" + " \\ifx#4\\empty\\else%\n" + " \\leavevmode\\\\%\n" + " \\lyxobjectsout{\\parbox{\\linewidth}{#4}}%\n" + " \\fi%\n" + "}\n" + "\\DeclareRobustCommand{\\lyxudisplayobjdeleted}[4][]{%\n" + " \\ifx#4\\empty\\else%\n" + " \\leavevmode\\\\%\n" + " \\raisebox{-\\belowdisplayshortskip}{%\n" + " \\lyxobjectsout{\\parbox[b]{\\linewidth}{#4}}}%\n" + " \\leavevmode\\\\%\n" + " \\fi%\n" + "}\n"); + +static docstring const changetracking_xcolor_ulem_cb_object_def = from_ascii( + "%% Change tracking with ulem, xcolor and changebars:ct markup for complex objects\n" + "\\DeclareRobustCommand{\\lyxobjdeleted}[4][]{%\n" + " \\protect\\cbstart\\lyxobjectsout{#4}%\n" + " \\protect\\cbend%\n" + "}\n" + "\\DeclareRobustCommand{\\lyxdisplayobjdeleted}[4][]{%\n" + " \\ifx#4\\empty\\else%\n" + " \\leavevmode\\\\%\n" + " \\protect\\cbstart%\n" + " \\lyxobjectsout{\\parbox{\\linewidth}{#4}}%\n" + " \\protect\\cbend%\n" + " \\fi%\n" + "}\n" + "\\DeclareRobustCommand{\\lyxudisplayobjdeleted}[4][]{%\n" + " \\ifx#4\\empty\\else%\n" + " \\leavevmode\\\\%\n" + " \\raisebox{-\\belowdisplayshortskip}{%\n" + " \\protect\\cbstart%\n" + " \\lyxobjectsout{\\parbox[b]{\\linewidth}{#4}}}%\n" + " \\protect\\cbend%\n" + " \\leavevmode\\\\%\n" + " \\fi%\n" + "}\n"); + +static docstring const changetracking_xcolor_ulem_hyperref_object_def = from_ascii( + "%% Change tracking with ulem, xcolor, and hyperref: ct markup for complex objects\n" + "\\DeclareRobustCommand{\\lyxobjdeleted}[4][]{\\texorpdfstring{\\lyxobjectsout{#4}}{}}\n" + "\\DeclareRobustCommand{\\lyxdisplayobjdeleted}[4][]{%\n" + " \\ifx#4\\empty\\else%\n" + " \\texorpdfstring{\\leavevmode\\\\\\lyxobjectsout{\\parbox{\\linewidth}{#4}}}{}%\n" + " \\fi%\n" + "}\n" + "\\DeclareRobustCommand{\\lyxudisplayobjdeleted}[4][]{%\n" + " \\ifx#4\\empty\\else%\n" + " \\texorpdfstring{\\leavevmode\\\\\\raisebox{-\\belowdisplayshortskip}{%\n" + " \\lyxobjectsout{\\parbox[b]{\\linewidth}{#4}}}}{}%\n" + " \\leavevmode\\\\%\n" + " \\fi%\n" + "}\n"); + +static docstring const changetracking_xcolor_ulem_hyperref_cb_object_def = from_ascii( + "%% Change tracking with ulem, xcolor, hyperref and changebars:\n" + "%% ct markup for complex objects\n" + "\\DeclareRobustCommand{\\lyxobjdeleted}[4][]{%\n" + " \\texorpdfstring{\\protect\\cbstart\\lyxobjectsout{#4}%\n" + " \\protect\\cbend}{}%\n" + "}\n" + "\\DeclareRobustCommand{\\lyxdisplayobjdeleted}[4][]{%\n" + " \\ifx#4\\empty\\else%\n" + " \\texorpdfstring{\\leavevmode\\\\\\protect\\cbstart%\n" + " \\lyxobjectsout{\\parbox{\\linewidth}{#4}}%\n" + " \\protect\\cbend%\n" + " }{}%\n" + " \\fi%\n" + "}\n" + "\\DeclareRobustCommand{\\lyxudisplayobjdeleted}[4][]{%\n" + " \\ifx#4\\empty\\else%\n" + " \\texorpdfstring{\\leavevmode\\\\\\protect\\cbstart%\n" + " \\raisebox{-\\belowdisplayshortskip}{%\n" + " \\lyxobjectsout{\\parbox[b]{\\linewidth}{#4}}%\n" + " }%\n" + " \\leavevmode\\\\%\n" + " }{}%\n" + " \\fi%\n" "}\n"); static docstring const changetracking_none_def = from_ascii( + "%% Change tracking: Disable markup in output\n" "\\newcommand{\\lyxadded}[3]{#3}\n" - "\\newcommand{\\lyxdeleted}[3]{}\n"); + "\\newcommand{\\lyxdeleted}[3]{}\n" + "\\newcommand{\\lyxobjdeleted}[3]{}\n" + "\\newcommand{\\lyxdisplayobjdeleted}[3]{}\n" + "\\newcommand{\\lyxudisplayobjdeleted}[3]{}\n"); static docstring const textgreek_LGR_def = from_ascii( "\\DeclareFontEncoding{LGR}{}{}\n"); static docstring const textgreek_def = from_ascii( "\\DeclareRobustCommand{\\greektext}{%\n" " \\fontencoding{LGR}\\selectfont\\def\\encodingdefault{LGR}}\n" - "\\DeclareRobustCommand{\\textgreek}[1]{\\leavevmode{\\greektext #1}}\n" - "\\ProvideTextCommand{\\~}{LGR}[1]{\\char126#1}\n"); + "\\DeclareRobustCommand{\\textgreek}[1]{\\leavevmode{\\greektext #1}}\n"); static docstring const textcyr_T2A_def = from_ascii( "\\InputIfFileExists{t2aenc.def}{}{%\n" @@ -259,7 +392,7 @@ static docstring const textcyr_T2A_def = from_ascii( static docstring const textcyr_def = from_ascii( "\\DeclareRobustCommand{\\cyrtext}{%\n" " \\fontencoding{T2A}\\selectfont\\def\\encodingdefault{T2A}}\n" - "\\DeclareRobustCommand{\\textcyr}[1]{\\leavevmode{\\cyrtext #1}}\n"); + "\\DeclareRobustCommand{\\textcyrillic}[1]{\\leavevmode{\\cyrtext #1}}\n"); static docstring const lyxmathsym_def = from_ascii( "\\newcommand{\\lyxmathsym}[1]{\\ifmmode\\begingroup\\def\\b@ld{bold}\n" @@ -321,67 +454,75 @@ static docstring const ogonek_def = from_ascii( static docstring const lyxaccent_def = from_ascii( "%% custom text accent \\LyxTextAccent[]{}{}\n" - "\\newcommand*{\\LyxTextAccent}[3][0ex]{%\n" - " \\hmode@bgroup\\ooalign{\\null#3\\crcr\\hidewidth\n" - " \\raise#1\\hbox{#2}\\hidewidth}\\egroup}\n" - "%% select a font size smaller than the current font size:\n" - "\\newcommand{\\LyxAccentSize}[1][\\sf@size]{%\n" - " \\check@mathfonts\\fontsize#1\\z@\\math@fontsfalse\\selectfont\n" - "}\n"); + "\\newcommand*{\\LyxTextAccent}[3][0ex]{%\n" + " \\hmode@bgroup\\ooalign{\\null#3\\crcr\\hidewidth\n" + " \\raise#1\\hbox{#2}\\hidewidth}\\egroup}\n" + "%% select a font size smaller than the current font size:\n" + "\\newcommand{\\LyxAccentSize}[1][\\sf@size]{%\n" + " \\check@mathfonts\\fontsize#1\\z@\\math@fontsfalse\\selectfont\n" + "}\n"); static docstring const textcommabelow_def = from_ascii( - "\\ProvideTextCommandDefault{\\textcommabelow}[1]{%%\n" - " \\LyxTextAccent[-.31ex]{\\LyxAccentSize,}{#1}}\n"); + "\\ProvideTextCommandDefault{\\textcommabelow}[1]{%%\n" + " \\LyxTextAccent[-.31ex]{\\LyxAccentSize,}{#1}}\n"); static docstring const textcommaabove_def = from_ascii( - "\\ProvideTextCommandDefault{\\textcommaabove}[1]{%%\n" - " \\LyxTextAccent[.5ex]{\\LyxAccentSize`}{#1}}\n"); + "\\ProvideTextCommandDefault{\\textcommaabove}[1]{%%\n" + " \\LyxTextAccent[.5ex]{\\LyxAccentSize`}{#1}}\n"); static docstring const textcommaaboveright_def = from_ascii( - "\\ProvideTextCommandDefault{\\textcommaaboveright}[1]{%%\n" - " \\LyxTextAccent[.5ex]{\\LyxAccentSize\\ '}{#1}}\n"); + "\\ProvideTextCommandDefault{\\textcommaaboveright}[1]{%%\n" + " \\LyxTextAccent[.5ex]{\\LyxAccentSize\\ '}{#1}}\n"); // Baltic languages use a comma-accent instead of a cedilla static docstring const textbaltic_def = from_ascii( - "%% use comma accent instead of cedilla for these characters:\n" - "\\DeclareTextCompositeCommand{\\c}{T1}{g}{\\textcommaabove{g}}\n" - "\\DeclareTextCompositeCommand{\\c}{T1}{G}{\\textcommabelow{G}}\n" - "\\DeclareTextCompositeCommand{\\c}{T1}{k}{\\textcommabelow{k}}\n" - "\\DeclareTextCompositeCommand{\\c}{T1}{K}{\\textcommabelow{K}}\n" - "\\DeclareTextCompositeCommand{\\c}{T1}{l}{\\textcommabelow{l}}\n" - "\\DeclareTextCompositeCommand{\\c}{T1}{L}{\\textcommabelow{L}}\n" - "\\DeclareTextCompositeCommand{\\c}{T1}{n}{\\textcommabelow{n}}\n" - "\\DeclareTextCompositeCommand{\\c}{T1}{N}{\\textcommabelow{N}}\n" - "\\DeclareTextCompositeCommand{\\c}{T1}{r}{\\textcommabelow{r}}\n" - "\\DeclareTextCompositeCommand{\\c}{T1}{R}{\\textcommabelow{R}}\n"); + "%% use comma accent instead of cedilla for these characters:\n" + "\\DeclareTextCompositeCommand{\\c}{T1}{g}{\\textcommaabove{g}}\n" + "\\DeclareTextCompositeCommand{\\c}{T1}{G}{\\textcommabelow{G}}\n" + "\\DeclareTextCompositeCommand{\\c}{T1}{k}{\\textcommabelow{k}}\n" + "\\DeclareTextCompositeCommand{\\c}{T1}{K}{\\textcommabelow{K}}\n" + "\\DeclareTextCompositeCommand{\\c}{T1}{l}{\\textcommabelow{l}}\n" + "\\DeclareTextCompositeCommand{\\c}{T1}{L}{\\textcommabelow{L}}\n" + "\\DeclareTextCompositeCommand{\\c}{T1}{n}{\\textcommabelow{n}}\n" + "\\DeclareTextCompositeCommand{\\c}{T1}{N}{\\textcommabelow{N}}\n" + "\\DeclareTextCompositeCommand{\\c}{T1}{r}{\\textcommabelow{r}}\n" + "\\DeclareTextCompositeCommand{\\c}{T1}{R}{\\textcommabelow{R}}\n"); + +// Use cyrillic fonts to provide letter schwa in text (see #11062) +static docstring const textschwa_def = from_ascii( + "%% letter schwa missing in Latin fonts, use Cyrillic schwa\n" + "\\DeclareTextSymbolDefault{\\CYRSCHWA}{T2A}\n" + "\\DeclareTextSymbolDefault{\\cyrschwa}{T2A}\n" + "\\ProvideTextCommandDefault{\\textSchwa}{\\CYRSCHWA}\n" + "\\ProvideTextCommandDefault{\\textschwa}{\\cyrschwa}\n"); // split-level fractions static docstring const xfrac_def = from_ascii( "\\usepackage{xfrac}\n"); static docstring const smallLetterFrac_def = from_ascii( - "\\DeclareCollectionInstance{smallLetterFrac}{xfrac}{default}{text}\n" - " {phantom=c, scale-factor=1.0, slash-left-kern=-.05em}\n" - "\\DeclareCollectionInstance{smallLetterFrac}{xfrac}{lmr}{text}\n" - " {slash-symbol-font=ptm, phantom=c, scale-factor=1, slash-left-kern=-.05em}\n" - "\\DeclareCollectionInstance{smallLetterFrac}{xfrac}{lmss}{text}\n" - " {slash-symbol-font=ptm, phantom=c, scale-factor=1, slash-left-kern=-.05em}\n" - "\\DeclareCollectionInstance{smallLetterFrac}{xfrac}{cmr}{text}\n" - " {slash-symbol-font=ptm, phantom=c, scale-factor=1, slash-left-kern=-.05em}\n" - "\\DeclareCollectionInstance{smallLetterFrac}{xfrac}{cmss}{text}\n" - " {slash-symbol-font=ptm, phantom=c, scale-factor=1, slash-left-kern=-.05em}\n" - "\\newcommand{\\smallLetterFrac}[2]{%\n" - " {\\UseCollection{xfrac}{smallLetterFrac}\\sfrac{#1}{#2}}}\n"); + "\\DeclareCollectionInstance{smallLetterFrac}{xfrac}{default}{text}\n" + " {phantom=c, scale-factor=1.0, slash-left-kern=-.05em}\n" + "\\DeclareCollectionInstance{smallLetterFrac}{xfrac}{lmr}{text}\n" + " {slash-symbol-font=ptm, phantom=c, scale-factor=1, slash-left-kern=-.05em}\n" + "\\DeclareCollectionInstance{smallLetterFrac}{xfrac}{lmss}{text}\n" + " {slash-symbol-font=ptm, phantom=c, scale-factor=1, slash-left-kern=-.05em}\n" + "\\DeclareCollectionInstance{smallLetterFrac}{xfrac}{cmr}{text}\n" + " {slash-symbol-font=ptm, phantom=c, scale-factor=1, slash-left-kern=-.05em}\n" + "\\DeclareCollectionInstance{smallLetterFrac}{xfrac}{cmss}{text}\n" + " {slash-symbol-font=ptm, phantom=c, scale-factor=1, slash-left-kern=-.05em}\n" + "\\newcommand{\\smallLetterFrac}[2]{%\n" + " {\\UseCollection{xfrac}{smallLetterFrac}\\sfrac{#1}{#2}}}\n"); static docstring const lyxref_def = from_ascii( - "\\RS@ifundefined{subsecref}\n" - " {\\newref{subsec}{name = \\RSsectxt}}\n" - " {}\n" - "\\RS@ifundefined{thmref}\n" - " {\\def\\RSthmtxt{theorem~}\\newref{thm}{name = \\RSthmtxt}}\n" - " {}\n" - "\\RS@ifundefined{lemref}\n" - " {\\def\\RSlemtxt{lemma~}\\newref{lem}{name = \\RSlemtxt}}\n" - " {}\n"); + "\\RS@ifundefined{subsecref}\n" + " {\\newref{subsec}{name = \\RSsectxt}}\n" + " {}\n" + "\\RS@ifundefined{thmref}\n" + " {\\def\\RSthmtxt{theorem~}\\newref{thm}{name = \\RSthmtxt}}\n" + " {}\n" + "\\RS@ifundefined{lemref}\n" + " {\\def\\RSlemtxt{lemma~}\\newref{lem}{name = \\RSlemtxt}}\n" + " {}\n"); // Make sure the columns are also outputed as rtl static docstring const rtloutputdblcol_def = from_ascii( @@ -460,7 +601,7 @@ static docstring const lyxstrikeout_style = from_ascii( LaTeXFeatures::LaTeXFeatures(Buffer const & b, BufferParams const & p, - OutputParams const & r) + OutputParams const & r) : buffer_(&b), params_(p), runparams_(r), in_float_(false), in_deleted_inset_(false) {} @@ -545,6 +686,12 @@ void LaTeXFeatures::require(set const & names) } +void LaTeXFeatures::provide(string const & name) +{ + provides_.insert(name); +} + + void LaTeXFeatures::useLayout(docstring const & layoutname) { useLayout(layoutname, 0); @@ -570,7 +717,7 @@ void LaTeXFeatures::useLayout(docstring const & layoutname, int level) return; Layout const & layout = tclass[layoutname]; - require(layout.requires()); + require(layout.required()); if (!layout.depends_on().empty()) { useLayout(layout.depends_on(), level + 1); @@ -597,7 +744,7 @@ void LaTeXFeatures::useInsetLayout(InsetLayout const & lay) != usedInsetLayouts_.end()) return; - require(lay.requires()); + require(lay.required()); usedInsetLayouts_.push_back(lname); } @@ -610,6 +757,11 @@ bool LaTeXFeatures::isRequired(string const & name) const bool LaTeXFeatures::isProvided(string const & name) const { + // Currently, this is only features provided by babel languages + // (such as textgreek) + if (provides_.find(name) != provides_.end()) + return true; + if (params_.useNonTeXFonts) return params_.documentClass().provides(name); @@ -635,9 +787,6 @@ bool LaTeXFeatures::isProvided(string const & name) const from_ascii(params_.fontsMath())).provides(name, ot1, complete, nomath); - // TODO: "textbaltic" provided, if the font-encoding is "L7x" - // "textgreek" provided, if a language with font-encoding LGR is used in the document - // "textcyr" provided, if a language with font-encoding T2A is used in the document } @@ -726,8 +875,14 @@ void LaTeXFeatures::useFloat(string const & name, bool subfloat) // use the "H" modifier. This includes modified table and // figure floats. (Lgb) Floating const & fl = params_.documentClass().floats().getType(name); - if (!fl.floattype().empty() && fl.usesFloatPkg()) { - require("float"); + if (!fl.floattype().empty()) { + if (fl.usesFloatPkg()) + require("float"); + if (!fl.required().empty()) { + vector reqs = getVectorFromString(fl.required()); + for (auto const & req : reqs) + require(req); + } } } @@ -736,13 +891,16 @@ void LaTeXFeatures::useLanguage(Language const * lang) { if (!lang->babel().empty() || !lang->polyglossia().empty()) UsedLanguages_.insert(lang); - if (!lang->requires().empty()) - require(lang->requires()); + if (!lang->required().empty()) + require(lang->required()); + // currently only supported for Babel + if (!lang->provides().empty() && useBabel()) + provide(lang->provides()); // CJK languages do not have a babel name. // They use the CJK package if (lang->encoding()->package() == Encoding::CJK) require("CJK"); - // japanese package is special + // japanese babel language is special (tied to the pLaTeX engine). if (lang->encoding()->package() == Encoding::japanese) require("japanese"); } @@ -832,7 +990,7 @@ vector LaTeXFeatures::getBabelExclusiveLanguages() const string LaTeXFeatures::getBabelLanguages() const { - ostringstream languages; + ostringstream langs; bool first = true; LanguageList::const_iterator const begin = UsedLanguages_.begin(); @@ -842,27 +1000,41 @@ string LaTeXFeatures::getBabelLanguages() const if ((*cit)->babel().empty()) continue; if (!first) - languages << ','; + langs << ','; else first = false; - languages << (*cit)->babel(); + langs << (*cit)->babel(); } - return languages.str(); + return langs.str(); } set LaTeXFeatures::getPolyglossiaLanguages() const { - set languages; + set langs; LanguageList::const_iterator const begin = UsedLanguages_.begin(); for (LanguageList::const_iterator cit = begin; cit != UsedLanguages_.end(); ++cit) { // We do not need the variants here - languages.insert((*cit)->polyglossia()); + langs.insert((*cit)->polyglossia()); } - return languages; + return langs; +} + + +string LaTeXFeatures::getActiveChars() const +{ + string res; + // first the main language + res += params_.language->activeChars(); + // now the secondary languages + LanguageList::const_iterator const begin = UsedLanguages_.begin(); + for (LanguageList::const_iterator cit = begin; + cit != UsedLanguages_.end(); ++cit) + res += ((*cit)->activeChars()); + return res; } @@ -871,51 +1043,58 @@ set LaTeXFeatures::getEncodingSet(string const & doc_encoding) const // This does only find encodings of languages supported by babel, but // that does not matter since we don't have a language with an // encoding supported by inputenc but without babel support. - set encodings; - LanguageList::const_iterator it = UsedLanguages_.begin(); - LanguageList::const_iterator end = UsedLanguages_.end(); - for (; it != end; ++it) - if ((*it)->encoding()->latexName() != doc_encoding && - ((*it)->encoding()->package() == Encoding::inputenc - || (*it)->encoding()->package() == Encoding::japanese)) - encodings.insert((*it)->encoding()->latexName()); - return encodings; + set encs; + for (auto const & lang : UsedLanguages_) + if (lang->encoding()->latexName() != doc_encoding && + lang->encoding()->package() == Encoding::inputenc) + encs.insert(lang->encoding()->latexName()); + return encs; } -void LaTeXFeatures::getFontEncodings(vector & encodings) const +void LaTeXFeatures::getFontEncodings(vector & encs, bool const onlylangs) const { - // these must be loaded if glyphs of this script are used - // unless a language providing them is used in the document - if (mustProvide("textgreek") - && find(encodings.begin(), encodings.end(), "LGR") == encodings.end()) - encodings.insert(encodings.begin(), "LGR"); - if (mustProvide("textcyr") - && find(encodings.begin(), encodings.end(), "T2A") == encodings.end()) - encodings.insert(encodings.begin(), "T2A"); - - LanguageList::const_iterator it = UsedLanguages_.begin(); - LanguageList::const_iterator end = UsedLanguages_.end(); - for (; it != end; ++it) - if (!(*it)->fontenc().empty() - && ascii_lowercase((*it)->fontenc()) != "none") { - vector extraencs = getVectorFromString((*it)->fontenc()); - vector::const_iterator fit = extraencs.begin(); - for (; fit != extraencs.end(); ++fit) { - if (find(encodings.begin(), encodings.end(), *fit) == encodings.end()) - encodings.insert(encodings.begin(), *fit); - } + if (!onlylangs) { + // these must be loaded if glyphs of this script are used + // unless a language providing them is used in the document + if (mustProvide("textgreek") + && find(encs.begin(), encs.end(), "LGR") == encs.end()) + encs.insert(encs.begin(), "LGR"); + if ((mustProvide("textcyrillic") || mustProvide("textschwa")) + && find(encs.begin(), encs.end(), "T2A") == encs.end()) + encs.insert(encs.begin(), "T2A"); + } + + for (auto const & lang : UsedLanguages_) { + vector extraencs = + getVectorFromString(lang->fontenc(buffer().masterParams())); + for (auto const & extra : extraencs) { + if (extra != "none" && find(encs.begin(), encs.end(), extra) == encs.end()) + encs.insert(encs.begin(), extra); } + } +} + + +bool LaTeXFeatures::hasRTLLanguage() const +{ + if (params_.language->rightToLeft()) + return true; + for (auto const & lang : UsedLanguages_) + if (lang->rightToLeft()) + return true; + return false; } + namespace { char const * simplefeatures[] = { // note that the package order here will be the same in the LaTeX-output "array", "verbatim", + "cprotect", "longtable", - "rotating", "latexsym", "pifont", // subfig is handled in BufferParams.cpp @@ -927,17 +1106,14 @@ char const * simplefeatures[] = { the `float' package. See the caption package documentation for explanation.*/ "float", - "rotfloat", "wrapfig", "booktabs", - "dvipost", "fancybox", "calc", "units", "framed", "soul", - "textcomp", - "pmboxdraw", + "dingbat", "bbding", "ifsym", "txfonts", @@ -949,10 +1125,10 @@ char const * simplefeatures[] = { // "cancel", "ascii", "url", - "covington", "csquotes", "enumitem", "endnotes", + "enotez", "hhline", "ifthen", // listings is handled in BufferParams.cpp @@ -974,6 +1150,16 @@ char const * simplefeatures[] = { "todonotes", "forest", "varwidth", + "tablefootnote", + "afterpage", + "tabularx", + "tikz", + "xltabular", + "chessboard", + "xskak", + "pict2e", + "drs", + "environ" }; char const * bibliofeatures[] = { @@ -1096,6 +1282,30 @@ string const LaTeXFeatures::getPackages() const // The rest of these packages are somewhat more complicated // than those above. + if (mustProvide("changebar")) { + packages << "\\usepackage"; + if (runparams_.flavor == OutputParams::LATEX + || runparams_.flavor == OutputParams::DVILUATEX) + packages << "[dvips]"; + packages << "{changebar}\n"; + } + + if (mustProvide("footnote")) { + if (isRequired("hyperref")) + packages << "\\usepackage{footnotehyper}\n"; + else + packages << "\\usepackage{footnote}\n"; + } + + // [pdf]lscape is used to rotate longtables + if (mustProvide("lscape")) { + if (runparams_.flavor == OutputParams::LATEX + || runparams_.flavor == OutputParams::DVILUATEX) + packages << "\\usepackage{lscape}\n"; + else + packages << "\\usepackage{pdflscape}\n"; + } + // The tipa package and its extensions (tipx, tone) must not // be loaded with non-TeX fonts, since fontspec includes the // respective macros @@ -1180,6 +1390,13 @@ string const LaTeXFeatures::getPackages() const << "]{graphicx}\n"; } + // These must be loaded after graphicx, since they try + // to load graphicx without options + if (mustProvide("rotating")) + packages << "\\usepackage{rotating}\n"; + if (mustProvide("rotfloat")) + packages << "\\usepackage{rotfloat}\n"; + // lyxskak.sty --- newer chess support based on skak.sty if (mustProvide("chess")) packages << "\\usepackage[ps,mover]{lyxskak}\n"; @@ -1230,7 +1447,11 @@ string const LaTeXFeatures::getPackages() const // Some classes load natbib themselves, but still allow (or even require) // plain numeric citations (ReVTeX is such a case, see bug 5182). // This special case is indicated by the "natbib-internal" key. - if (mustProvide("natbib") && !isProvided("natbib-internal")) { + if (mustProvide("natbib") + && !isProvided("natbib-internal") + && !isProvided("biblatex") + && !isProvided("biblatex-natbib") + && !isProvided("jurabib")) { packages << "\\usepackage["; if (params_.citeEngineType() == ENGINE_TYPE_NUMERICAL) packages << "numbers"; @@ -1249,7 +1470,11 @@ string const LaTeXFeatures::getPackages() const } // jurabib -- we need version 0.6 at least. - if (mustProvide("jurabib")) { + if (mustProvide("jurabib") + && !isProvided("natbib-internal") + && !isProvided("natbib") + && !isProvided("biblatex") + && !isProvided("biblatex-natbib")) { packages << "\\usepackage"; if (!params_.biblio_opts.empty()) packages << '[' << params_.biblio_opts << ']'; @@ -1316,6 +1541,9 @@ TexString LaTeXFeatures::getMacros() const macros << getPreambleSnippets(); } + if (mustProvide("xetexdashbreakstate")) + macros << "\\XeTeXdashbreakstate 0" << '\n'; + if (mustProvide("papersize")) { if (runparams_.flavor == OutputParams::LATEX || runparams_.flavor == OutputParams::DVILUATEX) @@ -1327,10 +1555,24 @@ TexString LaTeXFeatures::getMacros() const } if (mustProvide("LyX")) { + macros << "\\providecommand{\\LyX}"; + // open conditional wrappers + if (runparams_.use_polyglossia && hasRTLLanguage()) + macros << "{\\@ensure@LTR"; if (isRequired("hyperref")) - macros << lyx_hyperref_def << '\n'; - else - macros << lyx_def << '\n'; + macros << "{\\texorpdfstring"; + if (useBabel()) + macros << "{\\ensureascii"; + // main definition + macros << lyx_def; + // close conditional wrappers + if (useBabel()) + macros << '}'; + if (isRequired("hyperref")) + macros << "{LyX}}"; + if (runparams_.use_polyglossia && hasRTLLanguage()) + macros << '}'; + macros << '\n'; } if (mustProvide("noun")) @@ -1349,7 +1591,7 @@ TexString LaTeXFeatures::getMacros() const macros << textgreek_def << '\n'; } - if (!usePolyglossia() && mustProvide("textcyr")) { + if (!usePolyglossia() && mustProvide("textcyrillic")) { // ensure T2A font encoding is set up also if fontenc is not loaded by LyX if (params_.main_font_encoding() == "default") macros << textcyr_T2A_def; @@ -1373,6 +1615,9 @@ TexString LaTeXFeatures::getMacros() const if (mustProvide("textbaltic")) macros << textbaltic_def << '\n'; + if (mustProvide("textschwa")) + macros << textschwa_def << '\n'; + // split-level fractions if (mustProvide("xfrac") || mustProvide("smallLetterFrac")) macros << xfrac_def << '\n'; @@ -1460,8 +1705,19 @@ TexString LaTeXFeatures::getMacros() const // greyed-out environment (note inset) // the color is specified in the routine // getColorOptions() to avoid LaTeX-package clashes - if (mustProvide("lyxgreyedout")) - macros << lyxgreyedout_def; + if (mustProvide("lyxgreyedout")) { + // We need different version for RTL (#8647) + if (hasRTLLanguage()) { + if (runparams_.flavor == OutputParams::LUATEX) + if (useBabel()) + macros << lyxgreyedout_luartl_babel_def; + else + macros << lyxgreyedout_luartl_def; + else + macros << lyxgreyedout_rtl_def; + } else + macros << lyxgreyedout_def; + } if (mustProvide("lyxdot")) macros << lyxdot_def << '\n'; @@ -1473,9 +1729,6 @@ TexString LaTeXFeatures::getMacros() const macros << lyxref_def << '\n'; // change tracking - if (mustProvide("ct-dvipost")) - macros << changetracking_dvipost_def; - if (mustProvide("ct-xcolor-ulem")) { streamsize const prec = macros.os().precision(2); @@ -1489,14 +1742,50 @@ TexString LaTeXFeatures::getMacros() const macros.os().precision(prec); - if (isRequired("hyperref")) - macros << changetracking_xcolor_ulem_hyperref_def; - else - macros << changetracking_xcolor_ulem_def; + macros << changetracking_xcolor_ulem_base_def; + + if (isRequired("changebar")) { + if (isRequired("hyperref")) + macros << changetracking_xcolor_ulem_hyperref_cb_def; + else + macros << changetracking_xcolor_ulem_cb_def; + } else { + if (isRequired("hyperref")) + macros << changetracking_xcolor_ulem_hyperref_def; + else + macros << changetracking_xcolor_ulem_def; + } } - if (mustProvide("ct-tikz-math-sout")) - macros << changetracking_tikz_math_sout_def; + if (mustProvide("ct-tikz-object-sout")) { + if (!mustProvide("ct-xcolor-ulem")) { + streamsize const prec = macros.os().precision(2); + + RGBColor cadd = rgbFromHexName(lcolor.getX11Name(Color_addedtext)); + macros << "\\providecolor{lyxadded}{rgb}{" + << cadd.r / 255.0 << ',' << cadd.g / 255.0 << ',' << cadd.b / 255.0 << "}\n"; + + RGBColor cdel = rgbFromHexName(lcolor.getX11Name(Color_deletedtext)); + macros << "\\providecolor{lyxdeleted}{rgb}{" + << cdel.r / 255.0 << ',' << cdel.g / 255.0 << ',' << cdel.b / 255.0 << "}\n"; + + macros.os().precision(prec); + } + + macros << changetracking_tikz_object_sout_def; + + if (isRequired("changebar")) { + if (isRequired("hyperref")) + macros << changetracking_xcolor_ulem_hyperref_cb_object_def; + else + macros << changetracking_xcolor_ulem_cb_object_def; + } else { + if (isRequired("hyperref")) + macros << changetracking_xcolor_ulem_hyperref_object_def; + else + macros << changetracking_xcolor_ulem_object_def; + } + } if (mustProvide("ct-none")) macros << changetracking_none_def; @@ -1545,21 +1834,6 @@ docstring const LaTeXFeatures::getBabelPostsettings() const } -bool LaTeXFeatures::needBabelLangOptions() const -{ - if (!lyxrc.language_global_options || params_.language->asBabelOptions()) - return true; - - LanguageList::const_iterator it = UsedLanguages_.begin(); - LanguageList::const_iterator end = UsedLanguages_.end(); - for (; it != end; ++it) - if ((*it)->asBabelOptions()) - return true; - - return false; -} - - string const LaTeXFeatures::loadAMSPackages() const { ostringstream tmp; @@ -1855,9 +2129,11 @@ docstring const LaTeXFeatures::getTClassI18nPreamble(bool use_babel, // encodings, only with fixed width encodings. Therefore we // need to force a fixed width encoding for // \lstlistlistingname and \lstlistingname (bug 9382). - // This needs to be consistent with InsetListings::latex(). + // This needs to be consistent with InsetListings::latex() + // rsp. InsetListings::forcedEncoding(). bool const need_fixedwidth = !use_minted && !runparams_.isFullUnicode() && + buffer().params().encoding().package() != Encoding::japanese && it->second.fixedwidthpreambleencoding(); // language dependent commands (once per document) snippets.insert(i18npreamble(it->second.langpreamble(),