Replace automatic logofication with insets

Previously, LyX did replace some words with typeset logos, and there was no
way to prvent this except putting them, in ERT (bug #4752). Now we have
special insets for these words, and standard text is left alone.
This commit is contained in:
Georg Baum 2015-03-01 11:16:57 +01:00
parent d50154ab04
commit 3e9e6e344a
29 changed files with 301 additions and 363 deletions

View File

@ -11,6 +11,12 @@ adjustments are made to tex2lyx and bugs are fixed in lyx2lyx.
-----------------------
2015-03-01 Georg Baum <Georg.Baum@post.rwth-aachen.de>
* Format incremented to 482
"LyX", "TeX", "LaTeX2e" and "LaTeX" are not automatically converted
to LaTeX macros anymore.
Instead, these are new flavours of InsetSpecialChar (bug 4752).
2015-02-24 Georg Baum <Georg.Baum@post.rwth-aachen.de>
* Format incremented to 481
"--" and "---" are not treated as endash and emdash anymore, since

View File

@ -85,7 +85,7 @@ format_relation = [("0_06", [200], minor_versions("0.6" , 4)),
("1_6", range(277,346), minor_versions("1.6" , 10)),
("2_0", range(346,414), minor_versions("2.0", 8)),
("2_1", range(414,475), minor_versions("2.1", 0)),
("2_2", range(475,482), minor_versions("2.2", 0))
("2_2", range(475,483), minor_versions("2.2", 0))
]
####################################################################

View File

@ -493,7 +493,7 @@ def convert_dashes(document):
if len(words) > 1 and words[0] == "\\begin_inset" and \
words[1] in ["CommandInset", "ERT", "Formula", "IPA"]:
# must not replace anything in insets that store LaTeX contents in .lyx files
# (math and command insets withut overridden read() and write() methods
# (math and command insets withut overridden read() and write() methods
# filtering out IPA makes Text::readParToken() more simple
# skip ERT as well since it is not needed there
j = find_end_of_inset(document.body, i)
@ -558,6 +558,92 @@ def revert_dashes(document):
i += 1
# order is important for the last three!
phrases = ["LyX", "LaTeX2e", "LaTeX", "TeX"]
def is_part_of_converted_phrase(line, j, phrase):
"is phrase part of an already converted phrase?"
for p in phrases:
converted = "\\SpecialCharNoPassThru \\" + p
pos = j + len(phrase) - len(converted)
if pos >= 0:
if line[pos:pos+len(converted)] == converted:
return True
return False
def convert_phrases(document):
"convert special phrases from plain text to \\SpecialCharNoPassThru"
if document.backend != "latex":
return
for phrase in phrases:
i = 0
while i < len(document.body):
words = document.body[i].split()
if len(words) > 1 and words[0] == "\\begin_inset" and \
words[1] in ["CommandInset", "Formula"]:
# must not replace anything in insets that store LaTeX contents in .lyx files
# (math and command insets withut overridden read() and write() methods
j = find_end_of_inset(document.body, i)
if j == -1:
document.warning("Malformed LyX document: Can't find end of Formula inset at line " + str(i))
i += 1
else:
i = j
continue
if document.body[i].find("\\") == 0:
i += 1
continue
j = document.body[i].find(phrase)
if j == -1:
i += 1
continue
if not is_part_of_converted_phrase(document.body[i], j, phrase):
front = document.body[i][:j]
back = document.body[i][j+len(phrase):]
if len(back) > 0:
document.body.insert(i+1, back)
# We cannot use SpecialChar since we do not know whether we are outside passThru
document.body[i] = front + "\\SpecialCharNoPassThru \\" + phrase
i += 1
def revert_phrases(document):
"convert special phrases to plain text"
i = 0
while i < len(document.body):
if len(words) > 1 and words[0] == "\\begin_inset" and \
words[1] in ["CommandInset", "Formula"]:
# see convert_phrases
j = find_end_of_inset(document.body, i)
if j == -1:
document.warning("Malformed LyX document: Can't find end of Formula inset at line " + str(i))
i += 1
else:
i = j
continue
replaced = False
for phrase in phrases:
# we can replace SpecialChar since LyX ensures that it cannot be inserted into passThru parts
if document.body[i].find("\\SpecialChar \\" + phrase) >= 0:
document.body[i] = document.body[i].replace("\\SpecialChar \\" + phrase, phrase)
replaced = True
if document.body[i].find("\\SpecialCharNoPassThru \\" + phrase) >= 0:
document.body[i] = document.body[i].replace("\\SpecialCharNoPassThru \\" + phrase, phrase)
replaced = True
if replaced and i+1 < len(document.body) and \
(document.body[i+1].find("\\") != 0 or \
document.body[i+1].find("\\SpecialChar") == 0) and \
len(document.body[i]) + len(document.body[i+1]) <= 80:
document.body[i] = document.body[i] + document.body[i+1]
document.body[i+1:i+2] = []
i -= 1
i += 1
##
# Conversion hub
#
@ -573,10 +659,12 @@ convert = [
[478, []],
[479, []],
[480, []],
[481, [convert_dashes]]
[481, [convert_dashes]],
[482, [convert_phrases]]
]
revert = [
[481, [revert_phrases]],
[480, [revert_dashes]],
[479, [revert_question_env]],
[478, [revert_beamer_lemma]],

View File

@ -399,6 +399,10 @@ Menuset
Item "Visible Space|V" "space-insert visible"
Item "Menu Separator|M" "specialchar-insert menu-separator"
Item "Phonetic Symbols|P" "ipa-insert"
Item "LyX Logo" "specialchar-insert lyx"
Item "TeX Logo" "specialchar-insert tex"
Item "LaTeX Logo" "specialchar-insert latex"
Item "LaTeX2e Logo" "specialchar-insert latex2e"
End
Menu "insert_formatting"

View File

@ -207,13 +207,6 @@ FontSize FontList::highestInRange(pos_type startpos, pos_type endpos,
}
bool FontList::hasChangeInRange(pos_type pos, int len) const
{
List::const_iterator cit = fontIterator(pos);
return cit == list_.end() || pos + len - 1 <= cit->pos();
}
void FontList::validate(LaTeXFeatures & features) const
{
const_iterator fcit = list_.begin();

View File

@ -112,12 +112,6 @@ public:
FontSize def_size
) const;
/// is there a font change in middle of the word?
bool hasChangeInRange(
pos_type pos, ///< position in the paragraph.
int len ///< length of the range to check.
) const;
///
void validate(LaTeXFeatures & features) const;

View File

@ -499,7 +499,7 @@ void LyXAction::init()
* \li Action: Inserts various characters into the document.
* \li Syntax: specialchar-insert <CHAR>
* \li Params: <CHAR>: hyphenation, ligature-break, slash, nobreakdash, dots,
end-of-sentence, menu-separator.
end-of-sentence, menu-separator, lyx, tex, latex, latex2e.
* \li Origin: JSpitzm, 6 Dec 2007
* \endvar
*/

View File

@ -363,13 +363,6 @@ public:
otexstream & os,
pos_type i,
unsigned int & column);
///
bool latexSpecialPhrase(
otexstream & os,
pos_type & i,
pos_type end_pos,
unsigned int & column,
OutputParams const & runparams);
///
void validate(LaTeXFeatures & features) const;
@ -378,9 +371,6 @@ public:
bool onlyText(Buffer const & buf, Font const & outerfont,
pos_type initial) const;
/// match a string against a particular point in the paragraph
bool isTextAt(string const & str, pos_type pos) const;
/// a vector of speller skip positions
typedef vector<FontSpan> SkipPositions;
typedef SkipPositions::const_iterator SkipPositionsIterator;
@ -508,26 +498,6 @@ public:
};
namespace {
struct special_phrase {
string phrase;
docstring macro;
bool builtin;
};
special_phrase const special_phrases[] = {
{ "LyX", from_ascii("\\LyX{}"), false },
{ "TeX", from_ascii("\\TeX{}"), true },
{ "LaTeX2e", from_ascii("\\LaTeXe{}"), true },
{ "LaTeX", from_ascii("\\LaTeX{}"), true },
};
size_t const phrases_nr = sizeof(special_phrases)/sizeof(special_phrase);
} // namespace anon
Paragraph::Private::Private(Paragraph * owner, Layout const & layout)
: owner_(owner), inset_owner_(0), id_(-1), begin_of_body_(0), layout_(&layout)
{
@ -1010,26 +980,6 @@ int Paragraph::Private::writeScriptChars(otexstream & os,
}
bool Paragraph::Private::isTextAt(string const & str, pos_type pos) const
{
pos_type const len = str.length();
// is the paragraph large enough?
if (pos + len > int(text_.size()))
return false;
// does the wanted text start at point?
for (string::size_type i = 0; i < str.length(); ++i) {
// Caution: direct comparison of characters works only
// because str is pure ASCII.
if (str[i] != text_[pos + i])
return false;
}
return fontlist_.hasChangeInRange(pos, len);
}
void Paragraph::Private::latexInset(BufferParams const & bparams,
otexstream & os,
OutputParams & runparams,
@ -1281,10 +1231,6 @@ void Paragraph::Private::latexSpecialChar(otexstream & os,
break;
default:
// LyX, LaTeX etc.
if (latexSpecialPhrase(os, i, end_pos, column, runparams))
return;
if (c == '\0')
return;
@ -1397,33 +1343,6 @@ bool Paragraph::Private::latexSpecialT3(char_type const c, otexstream & os,
}
/// \param end_pos
/// If [start_pos, end_pos) does not include entirely the special phrase, then
/// do not apply the macro transformation.
bool Paragraph::Private::latexSpecialPhrase(otexstream & os, pos_type & i, pos_type end_pos,
unsigned int & column, OutputParams const & runparams)
{
// FIXME: if we have "LaTeX" with a font
// change in the middle (before the 'T', then
// the "TeX" part is still special cased.
// Really we should only operate this on
// "words" for some definition of word
for (size_t pnr = 0; pnr < phrases_nr; ++pnr) {
if (!isTextAt(special_phrases[pnr].phrase, i)
|| (end_pos != -1 && i + int(special_phrases[pnr].phrase.size()) > end_pos))
continue;
if (runparams.moving_arg)
os << "\\protect";
os << special_phrases[pnr].macro;
i += special_phrases[pnr].phrase.length() - 1;
column += special_phrases[pnr].macro.length() - 1;
return true;
}
return false;
}
void Paragraph::Private::validate(LaTeXFeatures & features) const
{
if (layout_->inpreamble && inset_owner_) {
@ -1501,13 +1420,6 @@ void Paragraph::Private::validate(LaTeXFeatures & features) const
// then the contents
for (pos_type i = 0; i < int(text_.size()) ; ++i) {
for (size_t pnr = 0; pnr < phrases_nr; ++pnr) {
if (!special_phrases[pnr].builtin
&& isTextAt(special_phrases[pnr].phrase, i)) {
features.require(special_phrases[pnr].phrase);
break;
}
}
BufferEncodings::validate(text_[i], features);
}
}

View File

@ -486,12 +486,18 @@ void Text::readParToken(Paragraph & par, Lexer & lex,
} else if (token == "\\color") {
lex.next();
setLyXColor(lex.getString(), font.fontInfo());
} else if (token == "\\SpecialChar") {
} else if (token == "\\SpecialChar" ||
(token == "\\SpecialCharNoPassThru" &&
!par.layout().pass_thru && !inset().isPassThru())) {
auto_ptr<Inset> inset;
inset.reset(new InsetSpecialChar);
inset->read(lex);
inset->setBuffer(*buf);
par.insertInset(par.size(), inset.release(), font, change);
} else if (token == "\\SpecialCharNoPassThru") {
lex.next();
docstring const s = ltrim(lex.getDocString(), "\\");
par.insert(par.size(), s, font, change);
} else if (token == "\\IPAChar") {
auto_ptr<Inset> inset;
inset.reset(new InsetIPAChar);

View File

@ -1188,6 +1188,14 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
specialChar(cur, InsetSpecialChar::END_OF_SENTENCE);
else if (name == "menu-separator")
specialChar(cur, InsetSpecialChar::MENU_SEPARATOR);
else if (name == "lyx")
specialChar(cur, InsetSpecialChar::PHRASE_LYX);
else if (name == "tex")
specialChar(cur, InsetSpecialChar::PHRASE_TEX);
else if (name == "latex")
specialChar(cur, InsetSpecialChar::PHRASE_LATEX);
else if (name == "latex2e")
specialChar(cur, InsetSpecialChar::PHRASE_LATEX2E);
else if (name.empty())
lyxerr << "LyX function 'specialchar-insert' needs an argument." << endl;
else

View File

@ -50,32 +50,43 @@ void InsetSpecialChar::metrics(MetricsInfo & mi, Dimension & dim) const
dim.asc = fm.maxAscent();
dim.des = fm.maxDescent();
string s;
docstring s;
switch (kind_) {
case LIGATURE_BREAK:
s = "|";
s = from_ascii("|");
break;
case END_OF_SENTENCE:
s = ".";
s = from_ascii(".");
break;
case LDOTS:
s = ". . .";
s = from_ascii(". . .");
break;
case MENU_SEPARATOR:
s = " x ";
s = from_ascii(" x ");
break;
case HYPHENATION:
s = "-";
s = from_ascii("-");
break;
case SLASH:
s = "/";
s = from_ascii("/");
break;
case NOBREAKDASH:
s = "-";
s = from_ascii("-");
break;
case PHRASE_LYX:
s = from_ascii("LyX");
break;
case PHRASE_TEX:
s = from_ascii("TeX");
break;
case PHRASE_LATEX2E:
s = from_ascii("LaTeX2") + char_type(0x03b5);
break;
case PHRASE_LATEX:
s = from_ascii("LaTeX");
break;
}
docstring ds(s.begin(), s.end());
dim.wid = fm.width(ds);
dim.wid = fm.width(s);
if (kind_ == HYPHENATION && dim.wid > 5)
dim.wid -= 2; // to make it look shorter
@ -145,6 +156,22 @@ void InsetSpecialChar::draw(PainterInfo & pi, int x, int y) const
pi.pain.text(x, y, char_type('-'), font);
break;
}
case PHRASE_LYX:
font.setColor(Color_special);
pi.pain.text(x, y, from_ascii("LyX"), font);
break;
case PHRASE_TEX:
font.setColor(Color_special);
pi.pain.text(x, y, from_ascii("TeX"), font);
break;
case PHRASE_LATEX2E:
font.setColor(Color_special);
pi.pain.text(x, y, from_ascii("LaTeX2") + char_type(0x03b5), font);
break;
case PHRASE_LATEX:
font.setColor(Color_special);
pi.pain.text(x, y, from_ascii("LaTeX"), font);
break;
}
}
@ -175,6 +202,18 @@ void InsetSpecialChar::write(ostream & os) const
case NOBREAKDASH:
command = "\\nobreakdash-";
break;
case PHRASE_LYX:
command = "\\LyX";
break;
case PHRASE_TEX:
command = "\\TeX";
break;
case PHRASE_LATEX2E:
command = "\\LaTeX2e";
break;
case PHRASE_LATEX:
command = "\\LaTeX";
break;
}
os << "\\SpecialChar " << command << "\n";
}
@ -200,6 +239,14 @@ void InsetSpecialChar::read(Lexer & lex)
kind_ = SLASH;
else if (command == "\\nobreakdash-")
kind_ = NOBREAKDASH;
else if (command == "\\LyX")
kind_ = PHRASE_LYX;
else if (command == "\\TeX")
kind_ = PHRASE_TEX;
else if (command == "\\LaTeX2e")
kind_ = PHRASE_LATEX2E;
else if (command == "\\LaTeX")
kind_ = PHRASE_LATEX;
else
lex.printError("InsetSpecialChar: Unknown kind: `$$Token'");
}
@ -235,6 +282,26 @@ void InsetSpecialChar::latex(otexstream & os,
os << "\\protect";
os << "\\nobreakdash-";
break;
case PHRASE_LYX:
if (rp.moving_arg)
os << "\\protect";
os << "\\LyX{}";
break;
case PHRASE_TEX:
if (rp.moving_arg)
os << "\\protect";
os << "\\TeX{}";
break;
case PHRASE_LATEX2E:
if (rp.moving_arg)
os << "\\protect";
os << "\\LaTeX2e{}";
break;
case PHRASE_LATEX:
if (rp.moving_arg)
os << "\\protect";
os << "\\LaTeX{}";
break;
}
}
@ -263,6 +330,19 @@ int InsetSpecialChar::plaintext(odocstringstream & os,
case NOBREAKDASH:
os.put(0x2011);
return 1;
case PHRASE_LYX:
os << "LyX";
return 3;
case PHRASE_TEX:
os << "TeX";
return 3;
case PHRASE_LATEX2E:
os << "LaTeX2";
os.put(0x03b5);
return 7;
case PHRASE_LATEX:
os << "LaTeX";
return 5;
}
return 0;
}
@ -289,6 +369,19 @@ int InsetSpecialChar::docbook(odocstream & os, OutputParams const &) const
case NOBREAKDASH:
os << '-';
break;
case PHRASE_LYX:
os << "LyX";
break;
case PHRASE_TEX:
os << "TeX";
break;
case PHRASE_LATEX2E:
os << "LaTeX2";
os.put(0x03b5);
break;
case PHRASE_LATEX:
os << "LaTeX";
break;
}
return 0;
}
@ -317,6 +410,18 @@ docstring InsetSpecialChar::xhtml(XHTMLStream & xs, OutputParams const &) const
case NOBREAKDASH:
xs << XHTMLStream::ESCAPE_NONE << "&#8209;";
break;
case PHRASE_LYX:
xs << "LyX";
break;
case PHRASE_TEX:
xs << "TeX";
break;
case PHRASE_LATEX2E:
xs << "LaTeX2" << XHTMLStream::ESCAPE_NONE << "&#x3b5;";
break;
case PHRASE_LATEX:
xs << "LaTeX";
break;
}
return docstring();
}
@ -352,6 +457,8 @@ void InsetSpecialChar::validate(LaTeXFeatures & features) const
features.require("lyxarrow");
if (kind_ == NOBREAKDASH)
features.require("amsmath");
if (kind_ == PHRASE_LYX)
features.require("LyX");
}

View File

@ -41,7 +41,15 @@ public:
/// breakable slash
SLASH,
/// protected dash
NOBREAKDASH
NOBREAKDASH,
/// LyX logo
PHRASE_LYX,
/// TeX logo
PHRASE_TEX,
/// LaTeX2e logo
PHRASE_LATEX2E,
/// LaTeX logo
PHRASE_LATEX
};
///

View File

@ -1,5 +1,5 @@
#LyX file created by tex2lyx 2.2
\lyxformat 481
\lyxformat 482
\begin_document
\begin_header
\textclass article

View File

@ -1,5 +1,5 @@
#LyX file created by tex2lyx 2.2
\lyxformat 481
\lyxformat 482
\begin_document
\begin_header
\textclass article

View File

@ -1,5 +1,5 @@
#LyX file created by tex2lyx 2.2
\lyxformat 481
\lyxformat 482
\begin_document
\begin_header
\textclass article

View File

@ -1,5 +1,5 @@
#LyX file created by tex2lyx 2.2
\lyxformat 481
\lyxformat 482
\begin_document
\begin_header
\textclass article

View File

@ -1,5 +1,5 @@
#LyX file created by tex2lyx 2.2
\lyxformat 481
\lyxformat 482
\begin_document
\begin_header
\textclass article

View File

@ -1,5 +1,5 @@
#LyX file created by tex2lyx 2.2
\lyxformat 481
\lyxformat 482
\begin_document
\begin_header
\textclass article

View File

@ -1,5 +1,5 @@
#LyX file created by tex2lyx 2.2
\lyxformat 481
\lyxformat 482
\begin_document
\begin_header
\textclass article
@ -908,17 +908,7 @@ doublebox
\end_layout
\begin_layout Subsection
\begin_inset ERT
status collapsed
\begin_layout Plain Layout
LyX
\end_layout
\end_inset
Boxes
LyX Boxes
\end_layout
\begin_layout Standard

View File

@ -1,5 +1,5 @@
#LyX file created by tex2lyx 2.2
\lyxformat 481
\lyxformat 482
\begin_document
\begin_header
\textclass article
@ -296,17 +296,7 @@ status collapsed
\end_inset
will be parsed in ERT, since
\begin_inset ERT
status collapsed
\begin_layout Plain Layout
LyX
\end_layout
\end_inset
does not support refstyle and prettyref natively at the same time.
will be parsed in ERT, since LyX does not support refstyle and prettyref natively at the same time.
\end_layout
\begin_layout Section
@ -3130,7 +3120,8 @@ row
\begin_inset Quotes erd
\end_inset
of the table can take up several lines. Note however that TeX
of the table can take up several lines. Note however that \SpecialChar \TeX
\begin_inset space \space{}
\end_inset
@ -3457,17 +3448,7 @@ like this.
\end_layout
\begin_layout Standard
From bug 7412 another example with more captions (can currently not produced in
\begin_inset ERT
status collapsed
\begin_layout Plain Layout
LyX
\end_layout
\end_inset
):
From bug 7412 another example with more captions (can currently not produced in LyX):
\begin_inset Tabular
<lyxtabular version="3" rows="45" columns="2">
<features rotate="0" islongtable="true" lastFootEmpty="true">
@ -5324,17 +5305,7 @@ Macros
\end_layout
\begin_layout Standard
\begin_inset ERT
status collapsed
\begin_layout Plain Layout
LyX
\end_layout
\end_inset
supports several kinds of macros: def
LyX supports several kinds of macros: def
\begin_inset FormulaMacro
\def\macroa #1{a #1 a}
\end_inset
@ -5904,17 +5875,7 @@ Special formattings
\end_layout
\begin_layout Subsection
\begin_inset ERT
status collapsed
\begin_layout Plain Layout
LyX
\end_layout
\end_inset
line
LyX line
\end_layout
\begin_layout Standard
@ -6652,17 +6613,7 @@ linebreak[4]
\end_layout
\begin_layout Standard
There are even newlines with weird arguments, but these are not handled by
\begin_inset ERT
status collapsed
\begin_layout Plain Layout
LyX
\end_layout
\end_inset
There are even newlines with weird arguments, but these are not handled by LyX
\begin_inset ERT
status collapsed
@ -6736,34 +6687,14 @@ Then one has those macros with a long name for a short meaning, like ~, ^ or
\backslash
, \SpecialChar \slash{}
, \SpecialChar \nobreakdash-
and the characters that
\begin_inset ERT
status collapsed
\begin_layout Plain Layout
LaTeX
\end_layout
\end_inset
wants to espace because they are active, like _&#${}%.
and the characters that LaTeX wants to espace because they are active, like _&#${}%.
\end_layout
\begin_layout Standard
And what about special characters like hyphe\SpecialChar \-
nation mark, ellipsis\SpecialChar \ldots{}
, and end-of-sentence\SpecialChar \@.
\begin_inset ERT
status collapsed
\begin_layout Plain Layout
LyX
\end_layout
\end_inset
also supports a menu separator\SpecialChar \menuseparator
LyX also supports a menu separator\SpecialChar \menuseparator
and a spif\SpecialChar \textcompwordmark{}
fy ligature break.
\end_layout
@ -6833,87 +6764,11 @@ status collapsed
\end_layout
\begin_layout Standard
\begin_inset ERT
status collapsed
\begin_layout Plain Layout
LyX
\end_layout
\end_inset
translates the phrases
\begin_inset ERT
status collapsed
\begin_layout Plain Layout
LyX
\end_layout
\end_inset
,
\begin_inset ERT
status collapsed
\begin_layout Plain Layout
TeX
\end_layout
\end_inset
,
\begin_inset ERT
status collapsed
\begin_layout Plain Layout
LaTeX
\end_layout
\end_inset
2e and
\begin_inset ERT
status collapsed
\begin_layout Plain Layout
LaTeX
\end_layout
\end_inset
to the commands LyX, TeX, LaTeX2e and LaTeX. If these phrases occur as part of other words (like 1
\begin_inset ERT
status collapsed
\begin_layout Plain Layout
LyX
\end_layout
\end_inset
or a
\begin_inset ERT
status collapsed
\begin_layout Plain Layout
TeX
\end_layout
\end_inset
or
\begin_inset ERT
status collapsed
\begin_layout Plain Layout
LaTeX
\end_layout
\end_inset
3) they should not be put into ERT.
LyX translates the phrases LyX, TeX, LaTeX2e and LaTeX to the commands \SpecialChar \LyX
, \SpecialChar \TeX
, \SpecialChar \LaTeXe
and \SpecialChar \LaTeX
. If these phrases occur as part of other words (like 1LyX or aTeX or LaTeX3) they should not be put into ERT.
\end_layout
\begin_layout Standard

View File

@ -1,5 +1,5 @@
#LyX file created by tex2lyx 2.2
\lyxformat 481
\lyxformat 482
\begin_document
\begin_header
\textclass memoir

View File

@ -1,5 +1,5 @@
#LyX file created by tex2lyx 2.2
\lyxformat 481
\lyxformat 482
\begin_document
\begin_header
\textclass amsart
@ -89,17 +89,7 @@ The theorem is recognized is a style provided by the module theorems-ams, since
\end_layout
\begin_layout Standard
The lemma is not recognized as a command provided by a module, since the preamble code is from an older version of
\begin_inset ERT
status collapsed
\begin_layout Plain Layout
LyX
\end_layout
\end_inset
, and modules are only loaded if the preamble code matches (otherwise you could easily get completely different output for some often used names like
The lemma is not recognized as a command provided by a module, since the preamble code is from an older version of LyX, and modules are only loaded if the preamble code matches (otherwise you could easily get completely different output for some often used names like
\backslash
theorem.
\end_layout

View File

@ -1,5 +1,5 @@
#LyX file created by tex2lyx 2.2
\lyxformat 481
\lyxformat 482
\begin_document
\begin_header
\textclass book

View File

@ -1,5 +1,5 @@
#LyX file created by tex2lyx 2.2
\lyxformat 481
\lyxformat 482
\begin_document
\begin_header
\textclass scrbook

View File

@ -1,5 +1,5 @@
#LyX file created by tex2lyx 2.2
\lyxformat 481
\lyxformat 482
\begin_document
\begin_header
\textclass article
@ -446,7 +446,8 @@ test1
\end_layout
\begin_layout Standard
LyX is a document preparation system. It excels at letting you create complex technical and scientific articles with mathematics, cross-references, bibliographies, indices, etc. It is very good at documents of any length in which the usual processing abilities are required: automatic sectioning and pagination, spell checking, and so forth. It can also be used to write a letter to your mom, though granted, there are probably simpler programs available for that. It is definitely not the best tool for creating banners, flyers, or advertisements (we'll explain why later), though with some effort all these can be done, too.
\SpecialChar \LyX
is a document preparation system. It excels at letting you create complex technical and scientific articles with mathematics, cross-references, bibliographies, indices, etc. It is very good at documents of any length in which the usual processing abilities are required: automatic sectioning and pagination, spell checking, and so forth. It can also be used to write a letter to your mom, though granted, there are probably simpler programs available for that. It is definitely not the best tool for creating banners, flyers, or advertisements (we'll explain why later), though with some effort all these can be done, too.
\end_layout
\begin_layout Standard
@ -483,7 +484,8 @@ test2
\end_layout
\begin_layout Standard
LyX is a document preparation system. It excels at letting you create complex technical and scientific articles with mathematics, cross-references, bibliographies, indices, etc. It is very good at documents of any length in which the usual processing abilities are required: automatic sectioning and pagination, spell checking, and so forth. It can also be used to write a letter to your mom, though granted, there are probably simpler programs available for that. It is definitely not the best tool for creating banners, flyers, or advertisements (we'll explain why later), though with some effort all these can be done, too.
\SpecialChar \LyX
is a document preparation system. It excels at letting you create complex technical and scientific articles with mathematics, cross-references, bibliographies, indices, etc. It is very good at documents of any length in which the usual processing abilities are required: automatic sectioning and pagination, spell checking, and so forth. It can also be used to write a letter to your mom, though granted, there are probably simpler programs available for that. It is definitely not the best tool for creating banners, flyers, or advertisements (we'll explain why later), though with some effort all these can be done, too.
\end_layout
\begin_layout Standard
@ -541,7 +543,8 @@ dfgd
\end_layout
\begin_layout Standard
LyX is a document preparation system. It excels at letting you create complex technical and scientific articles with mathematics, cross-references, bibliographies, indices, etc. It is very good at documents of any length in which the usual processing abilities are required: automatic sectioning and pagination, spell checking, and so forth. It can also be used to write a letter to your mom, though granted, there are probably simpler programs available for that. It is definitely not the best tool for creating banners, flyers, or advertisements (we'll explain why later), though with some effort all these can be done, too.
\SpecialChar \LyX
is a document preparation system. It excels at letting you create complex technical and scientific articles with mathematics, cross-references, bibliographies, indices, etc. It is very good at documents of any length in which the usual processing abilities are required: automatic sectioning and pagination, spell checking, and so forth. It can also be used to write a letter to your mom, though granted, there are probably simpler programs available for that. It is definitely not the best tool for creating banners, flyers, or advertisements (we'll explain why later), though with some effort all these can be done, too.
\end_layout
\begin_layout Standard

View File

@ -1,5 +1,5 @@
#LyX file created by tex2lyx 2.2
\lyxformat 481
\lyxformat 482
\begin_document
\begin_header
\textclass article

View File

@ -1,5 +1,5 @@
#LyX file created by tex2lyx 2.2
\lyxformat 481
\lyxformat 482
\begin_document
\begin_header
\textclass article

View File

@ -249,12 +249,20 @@ char const * const known_coded_font_shapes[] = { "italic", "slanted",
/// Known special characters which need skip_spaces_braces() afterwards
char const * const known_special_chars[] = {"ldots",
"lyxarrow", "textcompwordmark",
"slash", "textasciitilde", "textasciicircum", "textbackslash", 0};
"slash", "textasciitilde", "textasciicircum", "textbackslash",
"LyX", "TeX", "LaTeXe",
"LaTeX", 0};
/// special characters from known_special_chars which may have a \\protect before
char const * const known_special_protect_chars[] = {"LyX", "TeX",
"LaTeXe", "LaTeX", 0};
/// the same as known_special_chars with .lyx names
char const * const known_coded_special_chars[] = {"\\SpecialChar \\ldots{}\n",
"\\SpecialChar \\menuseparator\n", "\\SpecialChar \\textcompwordmark{}\n",
"\\SpecialChar \\slash{}\n", "~", "^", "\n\\backslash\n", 0};
"\\SpecialChar \\slash{}\n", "~", "^", "\n\\backslash\n",
"\\SpecialChar \\LyX\n", "\\SpecialChar \\TeX\n", "\\SpecialChar \\LaTeXe\n",
"\\SpecialChar \\LaTeX\n", 0};
/*!
* Graphics file extensions known by the dvips driver of the graphics package.
@ -295,12 +303,6 @@ char const * const known_coded_spaces[] = { "space{}", "space{}",
"hfill{}", "dotfill{}", "hrulefill{}", "leftarrowfill{}", "rightarrowfill{}",
"upbracefill{}", "downbracefill{}", 0};
/// These are translated by LyX to commands like "\\LyX{}", so we have to put
/// them in ERT. "LaTeXe" must come before "LaTeX"!
char const * const known_phrases[] = {"LyX", "TeX", "LaTeXe", "LaTeX", 0};
char const * const known_coded_phrases[] = {"LyX", "TeX", "LaTeX2e", "LaTeX", 0};
int const known_phrase_lengths[] = {3, 5, 7, 0};
/// known TIPA combining diacritical marks
char const * const known_tipa_marks[] = {"textsubwedge", "textsubumlaut",
"textsubtilde", "textseagull", "textsubbridge", "textinvsubbridge",
@ -2360,28 +2362,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
else if (t.cat() == catLetter) {
context.check_layout(os);
// Workaround for bug 4752.
// FIXME: This whole code block needs to be removed
// when the bug is fixed and tex2lyx produces
// the updated file format.
// The replacement algorithm in LyX is so stupid that
// it even translates a phrase if it is part of a word.
bool handled = false;
for (int const * l = known_phrase_lengths; *l; ++l) {
string phrase = t.cs();
for (int i = 1; i < *l && p.next_token().isAlnumASCII(); ++i)
phrase += p.get_token().cs();
if (is_known(phrase, known_coded_phrases)) {
output_ert_inset(os, phrase, context);
handled = true;
break;
} else {
for (size_t i = 1; i < phrase.length(); ++i)
p.putback();
}
}
if (!handled)
os << t.cs();
os << t.cs();
}
else if (t.cat() == catOther ||
@ -3387,20 +3368,6 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
end_inset(os);
}
else if (is_known(t.cs(), known_phrases) ||
(t.cs() == "protect" &&
p.next_token().cat() == catEscape &&
is_known(p.next_token().cs(), known_phrases))) {
// LyX sometimes puts a \protect in front, so we have to ignore it
// FIXME: This needs to be changed when bug 4752 is fixed.
where = is_known(
t.cs() == "protect" ? p.get_token().cs() : t.cs(),
known_phrases);
context.check_layout(os);
os << known_coded_phrases[where - known_phrases];
skip_spaces_braces(p);
}
// handle refstyle first to catch \eqref which can also occur
// without refstyle. Only recognize these commands if
// refstyle.sty was found in the preamble (otherwise \eqref
@ -3811,7 +3778,14 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
p.setEncoding(enc, Encoding::inputenc);
}
else if ((where = is_known(t.cs(), known_special_chars))) {
else if (is_known(t.cs(), known_special_chars) ||
(t.cs() == "protect" &&
p.next_token().cat() == catEscape &&
is_known(p.next_token().cs(), known_special_protect_chars))) {
// LyX sometimes puts a \protect in front, so we have to ignore it
where = is_known(
t.cs() == "protect" ? p.get_token().cs() : t.cs(),
known_special_chars);
context.check_layout(os);
os << known_coded_special_chars[where - known_special_chars];
skip_spaces_braces(p);

View File

@ -36,8 +36,8 @@ extern char const * const lyx_version_info;
// Do not remove the comment below, so we get merge conflict in
// independent branches. Instead add your own.
#define LYX_FORMAT_LYX 481 // gb: endash and emdash
#define LYX_FORMAT_TEX2LYX 481
#define LYX_FORMAT_LYX 482 // gb: special phrases
#define LYX_FORMAT_TEX2LYX 482
#if LYX_FORMAT_TEX2LYX != LYX_FORMAT_LYX
#ifndef _MSC_VER