tex2lyx: support refstyle and its commands

fixes #4288
This commit is contained in:
Uwe Stöhr 2013-02-04 01:41:56 +01:00
parent 793dd3b9c0
commit 49c887761a
5 changed files with 259 additions and 10 deletions

View File

@ -32,6 +32,7 @@ TEST_FILES = \
test/test-insets.tex \ test/test-insets.tex \
test/test.ltx \ test/test.ltx \
test/test-modules.tex \ test/test-modules.tex \
test/test-refstyle-references.tex \
test/test-structure.tex \ test/test-structure.tex \
test/XeTeX-polyglossia.tex \ test/XeTeX-polyglossia.tex \
test/xfigtest.fig \ test/xfigtest.fig \

View File

@ -698,6 +698,9 @@ void Preamble::handle_package(Parser &p, string const & name,
if (name == "eco") if (name == "eco")
h_font_osf = "true"; h_font_osf = "true";
if (name == "refstyle")
h_use_refstyle = "1";
// after the detection and handling of special cases, we can remove the // after the detection and handling of special cases, we can remove the
// fonts, otherwise they would appear in the preamble, see bug #7856 // fonts, otherwise they would appear in the preamble, see bug #7856
if (is_known(name, known_roman_fonts) || is_known(name, known_sans_fonts) if (is_known(name, known_roman_fonts) || is_known(name, known_sans_fonts)

View File

@ -39,6 +39,8 @@ public:
/// ///
std::string notefontcolor() const { return h_notefontcolor; } std::string notefontcolor() const { return h_notefontcolor; }
/// ///
std::string refstyle() const { return h_use_refstyle; }
///
bool fontCJKSet() const { return h_font_cjk_set; } bool fontCJKSet() const { return h_font_cjk_set; }
/// ///
std::string fontCJK() const { return h_font_cjk; } std::string fontCJK() const { return h_font_cjk; }

View File

@ -0,0 +1,210 @@
\documentclass[english]{book}
\usepackage[T1]{fontenc}
\usepackage[latin9]{inputenc}
\usepackage{refstyle}
\usepackage{amsthm}
\makeatletter
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% LyX specific LaTeX commands.
\AtBeginDocument{\providecommand\partref[1]{\ref{part:#1}}}
\AtBeginDocument{\providecommand\chapref[1]{\ref{chap:#1}}}
\AtBeginDocument{\providecommand\secref[1]{\ref{sec:#1}}}
\AtBeginDocument{\providecommand\subref[1]{\ref{sub:#1}}}
\AtBeginDocument{\providecommand\parref[1]{\ref{par:#1}}}
\AtBeginDocument{\providecommand\Staref[1]{\ref{Sta:#1}}}
\AtBeginDocument{\providecommand\fnref[1]{\ref{fn:#1}}}
\AtBeginDocument{\providecommand\enuref[1]{\ref{enu:#1}}}
\AtBeginDocument{\providecommand\eqref[1]{\ref{eq:#1}}}
\AtBeginDocument{\providecommand\lemref[1]{\ref{lem:#1}}}
\AtBeginDocument{\providecommand\thmref[1]{\ref{thm:#1}}}
\AtBeginDocument{\providecommand\corref[1]{\ref{cor:#1}}}
\AtBeginDocument{\providecommand\propref[1]{\ref{prop:#1}}}
\RS@ifundefined{subref}
{\def\RSsubtxt{section~}\newref{sub}{name = \RSsubtxt}}
{}
\RS@ifundefined{thmref}
{\def\RSthmtxt{theorem~}\newref{thm}{name = \RSthmtxt}}
{}
\RS@ifundefined{lemref}
{\def\RSlemtxt{lemma~}\newref{lem}{name = \RSlemtxt}}
{}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Textclass specific LaTeX commands.
\theoremstyle{plain}
\newtheorem{thm}{\protect\theoremname}
\theoremstyle{plain}
\newtheorem{lem}[thm]{\protect\lemmaname}
\theoremstyle{plain}
\newtheorem{cor}[thm]{\protect\corollaryname}
\theoremstyle{plain}
\newtheorem{prop}[thm]{\protect\propositionname}
\theoremstyle{plain}
\newtheorem{conjecture}[thm]{\protect\conjecturename}
\theoremstyle{plain}
\newtheorem{fact}[thm]{\protect\factname}
\theoremstyle{definition}
\newtheorem{defn}[thm]{\protect\definitionname}
\theoremstyle{definition}
\newtheorem{example}[thm]{\protect\examplename}
\theoremstyle{definition}
\newtheorem{problem}[thm]{\protect\problemname}
\theoremstyle{definition}
\newtheorem{xca}[thm]{\protect\exercisename}
\theoremstyle{remark}
\newtheorem{rem}[thm]{\protect\remarkname}
\theoremstyle{remark}
\newtheorem{claim}[thm]{\protect\claimname}
\ifx\proof\undefined
\newenvironment{proof}[1][\protect\proofname]{\par
\normalfont\topsep6\p@\@plus6\p@\relax
\trivlist
\itemindent\parindent
\item[\hskip\labelsep\scshape #1]\ignorespaces
}{%
\endtrivlist\@endpefalse
}
\providecommand{\proofname}{Proof}
\fi
\makeatother
\usepackage{babel}
\providecommand{\claimname}{Claim}
\providecommand{\conjecturename}{Conjecture}
\providecommand{\corollaryname}{Corollary}
\providecommand{\definitionname}{Definition}
\providecommand{\examplename}{Example}
\providecommand{\exercisename}{Exercise}
\providecommand{\factname}{Fact}
\providecommand{\lemmaname}{Lemma}
\providecommand{\problemname}{Problem}
\providecommand{\propositionname}{Proposition}
\providecommand{\remarkname}{Remark}
\providecommand{\theoremname}{Theorem}
\begin{document}
\part{part\label{part:part}}
\partref{part}
\chapter{chapter\label{chap:chapter}}
\chapref{chapter}
\section{Section\label{sec:Section}}
\secref{Section}
\subsection{Subsection\label{sub:subsection}}
Ref to \subref{subsection}.
\subsubsection{Subsubsection\label{sub:Subsubsection}}
Ref to \subref{Subsubsection}.
\paragraph{paragraph\label{par:paragraph}}
\parref{paragraph}
\subparagraph{subparagraph\label{par:subparagraph}}
\parref{subparagraph}
\begin{figure}
\protect\caption{\label{Sta:figure}figure}
\end{figure}
\Staref{figure}
\begin{table}
\protect\caption{\label{Sta:table}table}
\end{table}
\Staref{table}
\footnote{foot\label{fn:foot}%
}
\fnref{foot}
\marginpar{margin\label{margin}}
\ref{margin}
\begin{enumerate}
\item item\label{enu:item}
\end{enumerate}
\enuref{item}
\begin{equation}
A=B\label{eq:A=00003DB}
\end{equation}
\eqref{A=00003DB}
\begin{lem}
lemma\label{lem:lemma}
\lemref{lemma}\end{lem}
\begin{thm}
theorem\label{thm:theorem}
\thmref{theorem}\end{thm}
\begin{cor}
corollary\label{cor:corollary}
\corref{corollary}\end{cor}
\begin{prop}
proposition\label{prop:proposition}
\propref{proposition}\end{prop}
\begin{conjecture}
conjecture\label{conjecture}
\ref{conjecture}\end{conjecture}
\begin{fact}
fact\label{fact}
\ref{fact}\end{fact}
\begin{defn}
definition\label{definition}
\ref{definition}\end{defn}
\begin{example}
example\label{example}
\ref{example}\end{example}
\begin{problem}
problem\label{problem}
\ref{problem}\end{problem}
\begin{xca}
exercise\label{exercise}
\ref{exercise}\end{xca}
\begin{rem}
remark\label{remark}
\ref{remark}\end{rem}
\begin{claim}
claim\label{claim}
\ref{claim}\end{claim}
\begin{proof}
proof\label{proof}
\ref{proof}\end{proof}
\end{document}

View File

@ -117,6 +117,15 @@ char const * const known_ref_commands[] = { "ref", "pageref", "vref",
char const * const known_coded_ref_commands[] = { "ref", "pageref", "vref", char const * const known_coded_ref_commands[] = { "ref", "pageref", "vref",
"vpageref", "formatted", "eqref", 0 }; "vpageref", "formatted", "eqref", 0 };
char const * const known_refstyle_commands[] = { "chapref", "corref", "eqref",
"enuref", "fnref", "lemref", "parref", "partref", "propref", "secref", "Staref",
"subref", "thmref", 0 };
char const * const known_refstyle_prefixes[] = { "chap", "cor", "eq",
"enu", "fn", "lem", "par", "part", "prop", "sec", "Sta",
"sub", "thm", 0 };
/** /**
* supported CJK encodings * supported CJK encodings
* JIS does not work with LyX's encoding conversion * JIS does not work with LyX's encoding conversion
@ -3337,25 +3346,49 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
} }
else if ((where = is_known(t.cs(), known_ref_commands))) { else if ((where = is_known(t.cs(), known_ref_commands))) {
string const opt = p.getOpt(); // \eqref can also occur if refstyle is used
if (opt.empty()) { if (t.cs() == "eqref" && preamble.refstyle() == "1") {
context.check_layout(os); context.check_layout(os);
begin_command_inset(os, "ref", begin_command_inset(os, "ref", "formatted");
known_coded_ref_commands[where - known_ref_commands]); os << "reference \"eq:"
os << "reference \""
<< convert_command_inset_arg(p.verbatim_item()) << convert_command_inset_arg(p.verbatim_item())
<< "\"\n"; << "\"\n";
end_inset(os); end_inset(os);
if (t.cs() == "vref" || t.cs() == "vpageref") preamble.registerAutomaticallyLoadedPackage("refstyle");
preamble.registerAutomaticallyLoadedPackage("varioref");
} else { } else {
// LyX does not support optional arguments of ref commands string const opt = p.getOpt();
handle_ert(os, t.asInput() + '[' + opt + "]{" + if (opt.empty()) {
context.check_layout(os);
begin_command_inset(os, "ref",
known_coded_ref_commands[where - known_ref_commands]);
os << "reference \""
<< convert_command_inset_arg(p.verbatim_item())
<< "\"\n";
end_inset(os);
if (t.cs() == "vref" || t.cs() == "vpageref")
preamble.registerAutomaticallyLoadedPackage("varioref");
} else {
// LyX does not yet support optional arguments of ref commands
handle_ert(os, t.asInput() + '[' + opt + "]{" +
p.verbatim_item() + "}", context); p.verbatim_item() + "}", context);
}
} }
} }
else if ((where = is_known(t.cs(), known_refstyle_commands))) {
context.check_layout(os);
// \eqref can also occur if refstyle is not used
// this case is already handled in the previous else if
begin_command_inset(os, "ref", "formatted");
os << "reference \"";
os << known_refstyle_prefixes[where - known_refstyle_commands]
<< ":";
os << convert_command_inset_arg(p.verbatim_item())
<< "\"\n";
end_inset(os);
preamble.registerAutomaticallyLoadedPackage("refstyle");
}
else if (use_natbib && else if (use_natbib &&
is_known(t.cs(), known_natbib_commands) && is_known(t.cs(), known_natbib_commands) &&
((t.cs() != "citefullauthor" && ((t.cs() != "citefullauthor" &&