From 6bd70011e959733556debb11411c35bfd36cecfb Mon Sep 17 00:00:00 2001 From: Guillaume Munch Date: Tue, 22 Mar 2016 21:57:17 +0000 Subject: [PATCH 01/76] LyXToolBox: a QToolBox with minimum size management The purpose of this custom widget is to allow the use of a QToolBox in a limited area. The stock QToolBox does not provide a minimum size hint that depends on the size of the pages; it assumes that there is enough room. This subclass sets the minimal size of the QToolbox. Without this, the size of the QToolbox is only determined by values in the ui file and therefore causes portability and localisation issues. Note that the computation of the minimum size hint depends on the minimum size hints of the page widgets. Therefore page widgets must have a layout with layoutSizeContraint = SetMinimumSize or similar. --- src/frontends/qt4/LyXToolBox.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/frontends/qt4/LyXToolBox.cpp b/src/frontends/qt4/LyXToolBox.cpp index 4e754f98ab..110efa6bed 100644 --- a/src/frontends/qt4/LyXToolBox.cpp +++ b/src/frontends/qt4/LyXToolBox.cpp @@ -10,7 +10,6 @@ */ #include - #include "LyXToolBox.h" #include From a879bc257519f030322d8d99643ccf3e52c1b62e Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Fri, 22 Apr 2016 12:11:00 +0200 Subject: [PATCH 02/76] Fix horizontal scrolling in full-width collapsable insets While a one paragraph large collapsable inset (containing for example a tabular) could be very wide and trigger horizontal scrolling, the code that makes collapsable insets wide when they contain several paragraphs would actually make them narrower in this case. Typical example is a wide tabular and a caption in a table float, where horizontal scrolling would not trigger. --- src/TextMetrics.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp index 810b21a584..816f4bacd6 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -448,7 +448,7 @@ bool TextMetrics::redoParagraph(pit_type const pit) setRowHeight(row, pit); row.setChanged(false); if (row_index || row.endpos() < par.size() - || (row.right_boundary() && par.inInset().lyxCode() != CELL_CODE)) + || (row.right_boundary() && par.inInset().lyxCode() != CELL_CODE)) { /* If there is more than one row or the row has been * broken by a display inset or a newline, expand the text * to the full allowable width. This setting here is @@ -458,7 +458,9 @@ bool TextMetrics::redoParagraph(pit_type const pit) * that, and it triggers when using a caption in a * longtable (see bugs #9945 and #9757). */ - dim_.wid = max_width_; + if (dim_.wid < max_width_) + dim_.wid = max_width_; + } int const max_row_width = max(dim_.wid, row.width()); computeRowMetrics(pit, row, max_row_width); first = row.endpos(); From d48d426c72add4a6adf80876b13fa454d2a82ee4 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Fri, 22 Apr 2016 15:50:51 +0200 Subject: [PATCH 03/76] Rename InsetMathHull::isTable to allowsTabularFeatures The old name conflicted with the newly introduced Inset::isTable. Now the meaning is as follows. * Inset::isTable() is true when the inset is composed of lines and columns * InsetMathHull::allowsTabularFeatures is true when the current type of hull allows for tabular-like functions. --- src/mathed/InsetMathHull.cpp | 6 +++--- src/mathed/InsetMathHull.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mathed/InsetMathHull.cpp b/src/mathed/InsetMathHull.cpp index e684d237f5..6fa50e44b9 100644 --- a/src/mathed/InsetMathHull.cpp +++ b/src/mathed/InsetMathHull.cpp @@ -1097,7 +1097,7 @@ void InsetMathHull::footer_write(WriteStream & os) const } -bool InsetMathHull::isTable() const +bool InsetMathHull::allowsTabularFeatures() const { switch (type_) { case hullEqnArray: @@ -1859,7 +1859,7 @@ void InsetMathHull::doDispatch(Cursor & cur, FuncRequest & cmd) } case LFUN_TABULAR_FEATURE: - if (!isTable()) + if (!allowsTabularFeatures()) cur.undispatched(); else InsetMathGrid::doDispatch(cur, cmd); @@ -1980,7 +1980,7 @@ bool InsetMathHull::getStatus(Cursor & cur, FuncRequest const & cmd, return InsetMathGrid::getStatus(cur, cmd, status); case LFUN_TABULAR_FEATURE: { - if (!isTable()) + if (!allowsTabularFeatures()) return false; string s = cmd.getArg(0); if (!rowChangeOK() diff --git a/src/mathed/InsetMathHull.h b/src/mathed/InsetMathHull.h index b79b515ac2..c12fcc7593 100644 --- a/src/mathed/InsetMathHull.h +++ b/src/mathed/InsetMathHull.h @@ -241,7 +241,7 @@ private: /// consistency check void check() const; /// does it understand tabular-feature commands? - bool isTable() const; + bool allowsTabularFeatures() const; /// can this change its number of rows? bool rowChangeOK() const; /// can this change its number of cols? From e3540f33e17ca45ffa5ec532ee7f1113638cc366 Mon Sep 17 00:00:00 2001 From: Guillaume Munch Date: Fri, 8 Jan 2016 19:06:50 +0000 Subject: [PATCH 04/76] Simplify class structure in TocBackend Deriving from std::vector to provide helper functions appears a touch excessive. Use typedef instead and move helper functions to the base class. New header Toc.h provided to replace forward-declarations. Remove TocIterator which is useless. --- src/Buffer.cpp | 4 ++-- src/BufferView.cpp | 4 ++-- src/Changes.cpp | 2 +- src/DocIterator.cpp | 2 +- src/Makefile.am | 1 + src/Paragraph.h | 1 - src/Toc.h | 43 ++++++++++++++++++++++++++++++++++ src/TocBackend.cpp | 40 ++++++++++++++----------------- src/TocBackend.h | 43 +++++++--------------------------- src/frontends/qt4/TocModel.cpp | 7 +++--- src/frontends/qt4/TocModel.h | 4 ++-- src/insets/InsetTOC.h | 3 ++- 12 files changed, 83 insertions(+), 71 deletions(-) create mode 100644 src/Toc.h diff --git a/src/Buffer.cpp b/src/Buffer.cpp index 102b4ef690..e2185fbd89 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -2229,8 +2229,8 @@ void Buffer::getLabelList(vector & list) const list.clear(); shared_ptr toc = d->toc_backend.toc("label"); - TocIterator toc_it = toc->begin(); - TocIterator end = toc->end(); + Toc::const_iterator toc_it = toc->begin(); + Toc::const_iterator end = toc->end(); for (; toc_it != end; ++toc_it) { if (toc_it->depth() == 0) list.push_back(toc_it->str()); diff --git a/src/BufferView.cpp b/src/BufferView.cpp index 13d4c7abad..c6c489f994 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -2407,8 +2407,8 @@ void BufferView::gotoLabel(docstring const & label) // find label shared_ptr toc = buf->tocBackend().toc("label"); - TocIterator toc_it = toc->begin(); - TocIterator end = toc->end(); + Toc::const_iterator toc_it = toc->begin(); + Toc::const_iterator end = toc->end(); for (; toc_it != end; ++toc_it) { if (label == toc_it->str()) { lyx::dispatch(toc_it->action()); diff --git a/src/Changes.cpp b/src/Changes.cpp index 832ccacd76..9fa46f92a3 100644 --- a/src/Changes.cpp +++ b/src/Changes.cpp @@ -501,7 +501,7 @@ void Changes::addToToc(DocIterator const & cdit, Buffer const & buffer, // ¶ U+00B6 PILCROW SIGN str.push_back(0xb6); docstring const & author = author_list.get(it->change.author).name(); - Toc::iterator it = change_list->item(0, author); + Toc::iterator it = TocBackend::findItem(*change_list, 0, author); if (it == change_list->end()) { change_list->push_back(TocItem(dit, 0, author, true)); change_list->push_back(TocItem(dit, 1, str, output_active, diff --git a/src/DocIterator.cpp b/src/DocIterator.cpp index a059ad18d2..28d23e8d11 100644 --- a/src/DocIterator.cpp +++ b/src/DocIterator.cpp @@ -229,7 +229,7 @@ CursorSlice const & DocIterator::innerTextSlice() const DocIterator DocIterator::getInnerText() const { DocIterator texted = *this; - while (!texted.inTexted()) + while (!texted.inTexted()) texted.pop_back(); return texted; } diff --git a/src/Makefile.am b/src/Makefile.am index 047188f848..bbd2746d33 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -289,6 +289,7 @@ HEADERFILESCORE = \ Text.h \ TextClass.h \ TextMetrics.h \ + Toc.h \ TocBackend.h \ Trans.h \ Undo.h \ diff --git a/src/Paragraph.h b/src/Paragraph.h index d0ed94bfb0..73de6c173b 100644 --- a/src/Paragraph.h +++ b/src/Paragraph.h @@ -49,7 +49,6 @@ class MetricsInfo; class OutputParams; class PainterInfo; class ParagraphParameters; -class Toc; class WordLangTuple; class XHTMLStream; class otexstream; diff --git a/src/Toc.h b/src/Toc.h new file mode 100644 index 0000000000..d58a09a003 --- /dev/null +++ b/src/Toc.h @@ -0,0 +1,43 @@ +// -*- C++ -*- +/** + * \file TocBackend.h + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. + * + * \author Jean-Marc Lasgouttes + * \author Angus Leeming + * \author Abdelrazak Younes + * \author Guillaume Munch + * + * Full author contact details are available in file CREDITS. + */ + +#ifndef TOC_H +#define TOC_H + +#include "support/shared_ptr.h" + +#include +#include +#include + + +namespace lyx { + +// TocItem is defined in TocBackend.h +class TocItem; + +typedef std::vector Toc; + +class TocList : public std::map > +{ +private: + // TocList should never map to null pointers. + // We forbid the following method which creates null pointers. + using std::map >::operator[]; +}; + + +} // namespace lyx + +#endif // TOC_H diff --git a/src/TocBackend.cpp b/src/TocBackend.cpp index 9bd435f2f2..6526c57537 100644 --- a/src/TocBackend.cpp +++ b/src/TocBackend.cpp @@ -107,21 +107,15 @@ FuncRequest TocItem::action() const // /////////////////////////////////////////////////////////////////////////// -TocIterator Toc::item(DocIterator const & dit) const +Toc::const_iterator TocBackend::findItem(Toc const & toc, + DocIterator const & dit) { - TocIterator last = begin(); - TocIterator it = end(); + Toc::const_iterator last = toc.begin(); + Toc::const_iterator it = toc.end(); if (it == last) return it; - --it; - - DocIterator dit_text = dit; - if (dit_text.inMathed()) { - // We are only interested in text so remove the math CursorSlice. - while (dit_text.inMathed()) - dit_text.pop_back(); - } + DocIterator dit_text = dit.getInnerText(); for (; it != last; --it) { // We verify that we don't compare contents of two @@ -138,12 +132,12 @@ TocIterator Toc::item(DocIterator const & dit) const } -Toc::iterator Toc::item(int depth, docstring const & str) +Toc::iterator TocBackend::findItem(Toc & toc, int depth, docstring const & str) { - if (empty()) - return end(); - iterator it = begin(); - iterator itend = end(); + if (toc.empty()) + return toc.end(); + Toc::iterator it = toc.begin(); + Toc::iterator itend = toc.end(); for (; it != itend; ++it) { if (it->depth() == depth && it->str() == str) break; @@ -185,7 +179,7 @@ void TocBuilder::captionItem(DocIterator const & dit, docstring const & s, arg = "paragraph-goto " + paragraph_goto_arg((*toc_)[stack_.top().pos].dit_) + ";" + arg; FuncRequest func(LFUN_COMMAND_SEQUENCE, arg); - + if (!stack_.empty() && !stack_.top().is_captioned) { // The float we entered has not yet been assigned a caption. // Assign the caption string to it. @@ -286,7 +280,7 @@ bool TocBackend::updateItem(DocIterator const & dit_in) BufferParams const & bufparams = buffer_->params(); const int min_toclevel = bufparams.documentClass().min_toclevel(); - TocIterator toc_item = item("tableofcontents", dit); + Toc::const_iterator toc_item = item("tableofcontents", dit); docstring tocstring; @@ -336,14 +330,14 @@ void TocBackend::update(bool output_active, UpdateType utype) } -TocIterator TocBackend::item(string const & type, - DocIterator const & dit) const +Toc::const_iterator TocBackend::item(string const & type, + DocIterator const & dit) const { TocList::const_iterator toclist_it = tocs_.find(type); // Is the type supported? // We will try to make the best of it in release mode LASSERT(toclist_it != tocs_.end(), toclist_it = tocs_.begin()); - return toclist_it->second->item(dit); + return findItem(*toclist_it->second, dit); } @@ -352,8 +346,8 @@ void TocBackend::writePlaintextTocList(string const & type, { TocList::const_iterator cit = tocs_.find(type); if (cit != tocs_.end()) { - TocIterator ccit = cit->second->begin(); - TocIterator end = cit->second->end(); + Toc::const_iterator ccit = cit->second->begin(); + Toc::const_iterator end = cit->second->end(); for (; ccit != end; ++ccit) { os << ccit->asString() << from_utf8("\n"); if (os.str().size() > max_length) diff --git a/src/TocBackend.h b/src/TocBackend.h index cc5e4292d8..2520927406 100644 --- a/src/TocBackend.h +++ b/src/TocBackend.h @@ -18,14 +18,11 @@ #include "DocIterator.h" #include "FuncRequest.h" #include "OutputEnums.h" +#include "Toc.h" -#include "support/shared_ptr.h" #include "support/strfwd.h" -#include -#include #include -#include namespace lyx { @@ -67,7 +64,6 @@ enum TocType { */ class TocItem { - friend class Toc; friend class TocBackend; friend class TocBuilder; @@ -123,25 +119,6 @@ private: }; -/// -class Toc : public std::vector -{ -public: - // This is needed to work around a libc++ bug - // https://llvm.org/bugs/show_bug.cgi?id=24137 - Toc() {} - typedef std::vector::const_iterator const_iterator; - typedef std::vector::iterator iterator; - const_iterator item(DocIterator const & dit) const; - /// Look for a TocItem given its depth and string. - /// \return The first matching item. - /// \retval end() if no item was found. - iterator item(int depth, docstring const & str); -}; - -typedef Toc::const_iterator TocIterator; - - /// Caption-enabled TOC builders class TocBuilder { @@ -169,16 +146,6 @@ private: }; -/// The ToC list. -/// A class and no typedef because we want to forward declare it. -class TocList : public std::map > -{ -private: - // this can create null pointers - using std::map >::operator[]; -}; - - /// class TocBuilderStore { @@ -200,6 +167,12 @@ private: class TocBackend { public: + static Toc::const_iterator findItem(Toc const & toc, + DocIterator const & dit); + /// Look for a TocItem given its depth and string. + /// \return The first matching item. + /// \retval end() if no item was found. + static Toc::iterator findItem(Toc & toc, int depth, docstring const & str); /// TocBackend(Buffer const * buffer) : buffer_(buffer) {} /// @@ -216,7 +189,7 @@ public: /// nevel null shared_ptr builder(std::string const & type); /// Return the first Toc Item before the cursor - TocIterator item( + Toc::const_iterator item( std::string const & type, ///< Type of Toc. DocIterator const & dit ///< The cursor location in the document. ) const; diff --git a/src/frontends/qt4/TocModel.cpp b/src/frontends/qt4/TocModel.cpp index 7b4a38b223..7654983f09 100644 --- a/src/frontends/qt4/TocModel.cpp +++ b/src/frontends/qt4/TocModel.cpp @@ -133,7 +133,8 @@ QModelIndex TocModel::modelIndex(DocIterator const & dit) const if (toc_->empty()) return QModelIndex(); - unsigned int const toc_index = toc_->item(dit) - toc_->begin(); + unsigned int const toc_index = TocBackend::findItem(*toc_, dit) - + toc_->begin(); QModelIndexList list = model()->match(model()->index(0, 0), Qt::UserRole, QVariant(toc_index), 1, @@ -329,10 +330,10 @@ TocItem const TocModels::currentItem(QString const & type, return TocItem(); } LASSERT(index.model() == it.value()->model(), return TocItem()); - + return it.value()->tocItem(index); } - + void TocModels::updateItem(QString const & type, DocIterator const & dit) { diff --git a/src/frontends/qt4/TocModel.h b/src/frontends/qt4/TocModel.h index 4d4d442719..c959aba556 100644 --- a/src/frontends/qt4/TocModel.h +++ b/src/frontends/qt4/TocModel.h @@ -12,6 +12,8 @@ #ifndef TOCMODEL_H #define TOCMODEL_H +#include "Toc.h" + #include "support/shared_ptr.h" #include @@ -22,8 +24,6 @@ namespace lyx { class Buffer; class BufferView; class DocIterator; -class Toc; -class TocItem; namespace frontend { diff --git a/src/insets/InsetTOC.h b/src/insets/InsetTOC.h index bd6ba17973..7801f439ad 100644 --- a/src/insets/InsetTOC.h +++ b/src/insets/InsetTOC.h @@ -14,11 +14,12 @@ #include "InsetCommand.h" +#include "Toc.h" + namespace lyx { class Paragraph; -class Toc; /// Used to insert table of contents and similar lists /// at present, supports only \tableofcontents and \listoflistings. From c47bfee23138a0e368371565e2bb8bfc180b7f43 Mon Sep 17 00:00:00 2001 From: Guillaume Munch Date: Sat, 23 Apr 2016 22:22:11 +0100 Subject: [PATCH 05/76] Amend d7d4f65b Thanks Richard --- src/Toc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Toc.h b/src/Toc.h index d58a09a003..82f7ce1701 100644 --- a/src/Toc.h +++ b/src/Toc.h @@ -1,6 +1,6 @@ // -*- C++ -*- /** - * \file TocBackend.h + * \file Toc.h * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * From 5aa342ed75e7774734a2dcff8c219970ddeb5a7e Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Wed, 27 Apr 2016 21:16:34 +0200 Subject: [PATCH 06/76] Fix cursor position after redo When document settings are modified, a command inset-forall Branch inset-toggle asign is run to open as needed all branches. At the end of the said loop, the cursor is reset to where it was. However, the cur_after undo element member is not set because it already had a value. To make this work as expected, it is necessary in LFUN_INSET_FORALL to reset the cursor before ending the undo group and to insert a dummy recordUndo call. Fixes bug #10097. --- src/BufferView.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/BufferView.cpp b/src/BufferView.cpp index c6c489f994..b2da99880a 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -1855,9 +1855,17 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) if (!cur.nextInset() || cur.nextInset() == ins) cur.forwardInset(); } - cur.endUndoGroup(); cur = savecur; cur.fixIfBroken(); + /** This is a dummy undo record only to remember the cursor + * that has just been set; this will be used on a redo action + * (see ticket #10097) + + * FIXME: a better fix would be to have a way to set the + * cursor value directly, but I am not sure it is worth it. + */ + cur.recordUndo(); + cur.endUndoGroup(); dr.screenUpdate(Update::Force); dr.forceBufferUpdate(); From 0e740018ff15aa005f024b0c4ebbf68079778b3b Mon Sep 17 00:00:00 2001 From: Guillaume Munch Date: Fri, 29 Apr 2016 22:29:27 +0100 Subject: [PATCH 07/76] Whitespace --- src/frontends/qt4/TocWidget.cpp | 14 +++++++------- src/frontends/qt4/TocWidget.h | 6 +++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/frontends/qt4/TocWidget.cpp b/src/frontends/qt4/TocWidget.cpp index bb15f31e2b..24bc433776 100644 --- a/src/frontends/qt4/TocWidget.cpp +++ b/src/frontends/qt4/TocWidget.cpp @@ -86,7 +86,7 @@ TocWidget::TocWidget(GuiView & gui_view, QWidget * parent) this, SLOT(showContextMenu(const QPoint &))); connect(tocTV, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(showContextMenu(const QPoint &))); - connect(filterLE, SIGNAL(textEdited(QString)), + connect(filterLE, SIGNAL(textEdited(QString)), this, SLOT(filterContents())); init(QString()); @@ -98,7 +98,7 @@ void TocWidget::showContextMenu(const QPoint & pos) std::string name = "context-toc-" + fromqstr(current_type_); QMenu * menu = guiApp->menus().menu(toqstr(name), gui_view_); if (!menu) - return; + return; menu->exec(mapToGlobal(pos)); } @@ -109,9 +109,9 @@ Inset * TocWidget::itemInset() const TocItem const & item = gui_view_.tocModels().currentItem(current_type_, index); DocIterator const & dit = item.dit(); - + Inset * inset = 0; - if (current_type_ == "label" + if (current_type_ == "label" || current_type_ == "graphics" || current_type_ == "citation" || current_type_ == "child") @@ -120,7 +120,7 @@ Inset * TocWidget::itemInset() const else if (current_type_ == "branch" || current_type_ == "index" || current_type_ == "change" - || current_type_ == "table" + || current_type_ == "table" || current_type_ == "listing" || current_type_ == "figure") inset = &dit.inset(); @@ -415,7 +415,7 @@ void TocWidget::updateViewForce() tocTV->setEnabled(false); tocTV->setUpdatesEnabled(false); - QAbstractItemModel * toc_model = + QAbstractItemModel * toc_model = gui_view_.tocModels().model(current_type_); if (tocTV->model() != toc_model) { tocTV->setModel(toc_model); @@ -470,7 +470,7 @@ void TocWidget::filterContents() filterLE->text(), Qt::CaseInsensitive); tocTV->setRowHidden(index.row(), index.parent(), !matches); } - // recursively unhide parents of unhidden children + // recursively unhide parents of unhidden children for (int i = size - 1; i >= 0; i--) { QModelIndex index = indices[i]; if (!tocTV->isRowHidden(index.row(), index.parent()) diff --git a/src/frontends/qt4/TocWidget.h b/src/frontends/qt4/TocWidget.h index 608920a42a..962c21a238 100644 --- a/src/frontends/qt4/TocWidget.h +++ b/src/frontends/qt4/TocWidget.h @@ -74,15 +74,15 @@ private: /// void enableControls(bool enable = true); /// - bool canOutline() + bool canOutline() { return current_type_ == "tableofcontents"; } /// It is not possible to have synchronous navigation in a correct /// and efficient way with the label and change type because Toc::item() /// does a linear search. Even when fixed, it might even not be desirable /// to do so if we want to support drag&drop of labels and references. - bool canNavigate() + bool canNavigate() { return current_type_ != "label" && current_type_ != "change"; } - /// + /// bool isSortable() { return current_type_ != "tableofcontents"; } /// From 2f9d3233960c3dd362e2800e1675a094743b5c43 Mon Sep 17 00:00:00 2001 From: Guillaume Munch Date: Sat, 30 Apr 2016 00:25:46 +0100 Subject: [PATCH 08/76] TocWidget: Fix perf regression 4d1ad336 fixed #9754 but caused perf issues by cancelling the gains of having a timer (introduced after #7138). This introduces in GuiToc::enableView() a lightweight check of whether the widget should be updated. The logic is inspired from GuiViewSource::enableView(). --- src/frontends/qt4/GuiToc.cpp | 7 +++++-- src/frontends/qt4/TocWidget.cpp | 8 ++++++++ src/frontends/qt4/TocWidget.h | 2 ++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/frontends/qt4/GuiToc.cpp b/src/frontends/qt4/GuiToc.cpp index f603c56716..7d9b1e5646 100644 --- a/src/frontends/qt4/GuiToc.cpp +++ b/src/frontends/qt4/GuiToc.cpp @@ -66,9 +66,12 @@ void GuiToc::dispatchParams() } -void GuiToc::enableView(bool /*enable*/) +void GuiToc::enableView(bool enable) { - widget_->updateViewForce(); + widget_->checkModelChanged(); + if (!enable) + // In the opposite case, updateView() will be called anyway. + widget_->updateViewForce(); } diff --git a/src/frontends/qt4/TocWidget.cpp b/src/frontends/qt4/TocWidget.cpp index 24bc433776..e3693b7313 100644 --- a/src/frontends/qt4/TocWidget.cpp +++ b/src/frontends/qt4/TocWidget.cpp @@ -452,6 +452,14 @@ void TocWidget::updateViewForce() } +void TocWidget::checkModelChanged() +{ + if (!gui_view_.documentBufferView() || + gui_view_.tocModels().model(current_type_) != tocTV->model()) + updateViewForce(); +} + + void TocWidget::filterContents() { if (!tocTV->model()) diff --git a/src/frontends/qt4/TocWidget.h b/src/frontends/qt4/TocWidget.h index 962c21a238..39a6c2926a 100644 --- a/src/frontends/qt4/TocWidget.h +++ b/src/frontends/qt4/TocWidget.h @@ -42,6 +42,8 @@ public: /// bool getStatus(Cursor & cur, FuncRequest const & fr, FuncStatus & status) const; + // update the view when the model has changed + void checkModelChanged(); public Q_SLOTS: /// Schedule new update of the display unless already scheduled. From 27607b76f5dd790efb1964d068533e37d7e64f61 Mon Sep 17 00:00:00 2001 From: Guillaume Munch Date: Fri, 29 Apr 2016 22:48:53 +0100 Subject: [PATCH 09/76] TocWidget: clean-up the timer logic The timer logic introduced to solve bug #7138 was not entirely reliable; in particular it resulted in spurious updates (noticeable by the treeview collapsing just after one opens a branch, in particular). This commit cleans up the timer logic. I followed the original design decision of having an immediate update followed by a delayed update. Now the updates are appropriately compressed and done after a delay of 2s (as can be noticed with the treeview still collapsing, unfortunately, but after a more predictable delay...). --- src/frontends/qt4/GuiToc.cpp | 3 +- src/frontends/qt4/TocWidget.cpp | 51 +++++++++++++++++---------------- src/frontends/qt4/TocWidget.h | 19 ++++++++---- 3 files changed, 42 insertions(+), 31 deletions(-) diff --git a/src/frontends/qt4/GuiToc.cpp b/src/frontends/qt4/GuiToc.cpp index 7d9b1e5646..48349fcfa5 100644 --- a/src/frontends/qt4/GuiToc.cpp +++ b/src/frontends/qt4/GuiToc.cpp @@ -50,7 +50,6 @@ GuiToc::~GuiToc() void GuiToc::updateView() { widget_->updateView(); - return; } @@ -71,7 +70,7 @@ void GuiToc::enableView(bool enable) widget_->checkModelChanged(); if (!enable) // In the opposite case, updateView() will be called anyway. - widget_->updateViewForce(); + widget_->updateViewNow(); } diff --git a/src/frontends/qt4/TocWidget.cpp b/src/frontends/qt4/TocWidget.cpp index e3693b7313..4fa6aef7a3 100644 --- a/src/frontends/qt4/TocWidget.cpp +++ b/src/frontends/qt4/TocWidget.cpp @@ -35,19 +35,18 @@ #include #include -#include #include -#define DELAY_UPDATE_VIEW - using namespace std; namespace lyx { namespace frontend { TocWidget::TocWidget(GuiView & gui_view, QWidget * parent) - : QWidget(parent), depth_(0), persistent_(false), gui_view_(gui_view), update_delay_(0) + : QWidget(parent), depth_(0), persistent_(false), gui_view_(gui_view), + update_timer_short_(new QTimer(this)), + update_timer_long_(new QTimer(this)) { setupUi(this); @@ -89,6 +88,16 @@ TocWidget::TocWidget(GuiView & gui_view, QWidget * parent) connect(filterLE, SIGNAL(textEdited(QString)), this, SLOT(filterContents())); + // setting the update timer + update_timer_short_->setSingleShot(true); + update_timer_long_->setSingleShot(true); + update_timer_short_->setInterval(0); + update_timer_long_->setInterval(2000); + connect(update_timer_short_, SIGNAL(timeout()), + this, SLOT(realUpdateView())); + connect(update_timer_long_, SIGNAL(timeout()), + this, SLOT(realUpdateView())); + init(QString()); } @@ -256,7 +265,7 @@ void TocWidget::on_updateTB_clicked() void TocWidget::on_sortCB_stateChanged(int state) { gui_view_.tocModels().sort(current_type_, state == Qt::Checked); - updateViewForce(); + updateViewNow(); } @@ -308,7 +317,7 @@ void TocWidget::on_typeCO_currentIndexChanged(int index) if (index == -1) return; current_type_ = typeCO->itemData(index).toString(); - updateViewForce(); + updateViewNow(); if (typeCO->hasFocus()) gui_view_.setFocus(); } @@ -380,27 +389,24 @@ void TocWidget::enableControls(bool enable) void TocWidget::updateView() { -// Enable if you dont want the delaying business, cf #7138. -#ifndef DELAY_UPDATE_VIEW - updateViewForce(); - return; -#endif - // already scheduled? - if (update_delay_ == -1) - return; - QTimer::singleShot(update_delay_, this, SLOT(updateViewForce())); // Subtler optimization for having the delay more UI invisible. // We trigger update immediately for sparse editation actions, // i.e. there was no editation/cursor movement in last 2 sec. // At worst there will be +1 redraw after 2s in a such "calm" mode. - if (update_delay_ != 0) - updateViewForce(); - update_delay_ = -1; + if (!update_timer_long_->isActive()) + update_timer_short_->start(); + // resets the timer to trigger after 2s + update_timer_long_->start(); } -void TocWidget::updateViewForce() +void TocWidget::updateViewNow() +{ + update_timer_long_->stop(); + update_timer_short_->start(); +} + +void TocWidget::realUpdateView() { - update_delay_ = 2000; if (!gui_view_.documentBufferView()) { tocTV->setModel(0); depthSL->setMaximum(0); @@ -456,7 +462,7 @@ void TocWidget::checkModelChanged() { if (!gui_view_.documentBufferView() || gui_view_.tocModels().model(current_type_) != tocTV->model()) - updateViewForce(); + realUpdateView(); } @@ -528,9 +534,6 @@ void TocWidget::init(QString const & str) typeCO->blockSignals(true); typeCO->setCurrentIndex(new_index); typeCO->blockSignals(false); - - // no delay when the whole outliner is reseted. - update_delay_ = 0; } } // namespace frontend diff --git a/src/frontends/qt4/TocWidget.h b/src/frontends/qt4/TocWidget.h index 39a6c2926a..ec1d5ad264 100644 --- a/src/frontends/qt4/TocWidget.h +++ b/src/frontends/qt4/TocWidget.h @@ -18,6 +18,7 @@ #include "Cursor.h" #include "FuncCode.h" +#include #include class QModelIndex; @@ -46,10 +47,10 @@ public: void checkModelChanged(); public Q_SLOTS: - /// Schedule new update of the display unless already scheduled. + /// Schedule an update of the dialog after a delay void updateView(); - /// Update the display of the dialog whilst it is still visible. - void updateViewForce(); + /// Schedule an update of the dialog immediately + void updateViewNow(); protected Q_SLOTS: /// @@ -72,6 +73,10 @@ protected Q_SLOTS: void showContextMenu(const QPoint & pos); +private Q_SLOTS: + /// Update the display of the dialog + void realUpdateView(); + private: /// void enableControls(bool enable = true); @@ -103,8 +108,12 @@ private: bool persistent_; /// GuiView & gui_view_; - // next delay for outliner update in ms. -1 when already scheduled. - int update_delay_; + // Timers for scheduling updates: one immediately and one after a delay. + // This is according to the logic of the previous code: when at rest, the + // update is carried out immediately, and when an update was done recently, + // we schedule an update to occur 2s after resting. + QTimer * update_timer_short_; + QTimer * update_timer_long_; }; } // namespace frontend From 1639abb8edaa492c649e69d093436f8a96f07bec Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Sun, 1 May 2016 01:27:13 +0200 Subject: [PATCH 10/76] Let getPosNearX take horizontal scrolling into account If we do not do that, it is not possible to position the cursor after a long inset with the mouse. To do this, it is necessary to add the pit information to the Row object. This is a good idea in any case, and will allow to simplify some code later on. Fixes bug #10094. --- src/Row.cpp | 3 ++- src/Row.h | 6 ++++++ src/TextMetrics.cpp | 15 ++++++++++++++- src/TextMetrics.h | 2 +- 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/Row.cpp b/src/Row.cpp index d0694f7d2e..58a23805f2 100644 --- a/src/Row.cpp +++ b/src/Row.cpp @@ -148,7 +148,8 @@ Row::Row() : separator(0), label_hfill(0), left_margin(0), right_margin(0), sel_beg(-1), sel_end(-1), begin_margin_sel(false), end_margin_sel(false), - changed_(false), crc_(0), pos_(0), end_(0), right_boundary_(false) + changed_(false), crc_(0), + pit_(0), pos_(0), end_(0), right_boundary_(false) {} diff --git a/src/Row.h b/src/Row.h index f0c5b72ca1..0bd4597746 100644 --- a/src/Row.h +++ b/src/Row.h @@ -144,6 +144,10 @@ public: void setSelectionAndMargins(DocIterator const & beg, DocIterator const & end) const; + /// + void pit(pit_type p) { pit_ = p; } + /// + pit_type pit() const { return pit_; } /// void pos(pos_type p) { pos_ = p; } /// @@ -286,6 +290,8 @@ private: mutable bool changed_; /// CRC of row contents. mutable size_type crc_; + /// Index of the paragraph that contains this row + pit_type pit_; /// first pos covered by this row pos_type pos_; /// one behind last pos covered by this row diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp index 816f4bacd6..fdf0da6926 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -443,6 +443,7 @@ bool TextMetrics::redoParagraph(pit_type const pit) if (row_index == pm.rows().size()) pm.rows().push_back(Row()); Row & row = pm.rows()[row_index]; + row.pit(pit); row.pos(first); breakRow(row, right_margin, pit); setRowHeight(row, pit); @@ -1113,6 +1114,16 @@ pos_type TextMetrics::getPosNearX(Row const & row, int & x, int const xo = origin_.x_; x -= xo; + int offset = 0; + CursorSlice rowSlice(const_cast(text_->inset())); + rowSlice.pit() = row.pit(); + rowSlice.pos() = row.pos(); + + // Adapt to cursor row scroll offset if applicable. + if (bv_->currentRowSlice() == rowSlice) + offset = bv_->horizScrollOffset(); + x += offset; + pos_type pos = row.pos(); boundary = false; if (row.empty()) @@ -1166,8 +1177,10 @@ pos_type TextMetrics::getPosNearX(Row const & row, int & x, else boundary = row.right_boundary(); } - x += xo; + + x += xo - offset; //LYXERR0("getPosNearX ==> pos=" << pos << ", boundary=" << boundary); + return pos; } diff --git a/src/TextMetrics.h b/src/TextMetrics.h index f0abcb5201..6f5cf68733 100644 --- a/src/TextMetrics.h +++ b/src/TextMetrics.h @@ -150,7 +150,7 @@ private: public: /// returns the position near the specified x-coordinate of the row. /// x is an absolute screen coord, it is set to the real beginning - /// of this column. + /// of this column. This takes in account horizontal cursor row scrolling. pos_type getPosNearX(Row const & row, int & x, bool & boundary) const; /// returns pos in given par at given x coord. From 9a09fe38bd28c3a788fc3ca4da9904bcd7eb339a Mon Sep 17 00:00:00 2001 From: Guillaume Munch Date: Tue, 3 May 2016 21:09:15 +0100 Subject: [PATCH 11/76] getInnerText() --- src/BufferView.cpp | 4 +--- src/mathed/InsetMathHull.cpp | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/BufferView.cpp b/src/BufferView.cpp index b2da99880a..e6a69dece6 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -707,9 +707,7 @@ Change const BufferView::getCurrentChange() const DocIterator dit = d->cursor_.selectionBegin(); // The selected content might have been changed (see #7685) - while (dit.inMathed()) - // Find enclosing text cursor - dit.pop_back(); + dit = dit.getInnerText(); return dit.paragraph().lookupChange(dit.pos()); } diff --git a/src/mathed/InsetMathHull.cpp b/src/mathed/InsetMathHull.cpp index 6fa50e44b9..efdeb8b056 100644 --- a/src/mathed/InsetMathHull.cpp +++ b/src/mathed/InsetMathHull.cpp @@ -750,9 +750,7 @@ void InsetMathHull::preparePreview(DocIterator const & pos, macro_preamble.append(*it); // set the font series and size for this snippet - DocIterator dit = pos; - while (dit.inMathed()) - dit.pop_back(); + DocIterator dit = pos.getInnerText(); Paragraph const & par = dit.paragraph(); Font font = par.getFontSettings(buffer->params(), dit.pos()); font.fontInfo().realize(par.layout().font); From 6d4e6aad24edb7bcfbc49f03d2432fc9fa06954d Mon Sep 17 00:00:00 2001 From: Guillaume Munch Date: Sat, 30 Jan 2016 23:14:36 +0000 Subject: [PATCH 12/76] Automatically show the review toolbar if the document has tracked changes (#8738) For efficiency, we add a new flag to the buffer indicating when changes are present. This flag is updated at each buffer update, and also when explicitly requested via a dispatch result flag. --- lib/ui/default.ui | 3 ++- src/Buffer.cpp | 36 ++++++++++++++++++++++++++++ src/Buffer.h | 6 +++++ src/Changes.cpp | 28 ++++++++++++++++++++++ src/Changes.h | 13 ++++++++++ src/Cursor.cpp | 6 +++++ src/DispatchResult.h | 18 ++++++++++++-- src/Paragraph.cpp | 12 ++++++++++ src/Paragraph.h | 4 ++++ src/frontends/qt4/GuiApplication.cpp | 3 +++ src/frontends/qt4/GuiView.cpp | 5 ++-- 11 files changed, 129 insertions(+), 5 deletions(-) diff --git a/lib/ui/default.ui b/lib/ui/default.ui index 51a7f9b90e..4a1e154aab 100644 --- a/lib/ui/default.ui +++ b/lib/ui/default.ui @@ -34,7 +34,8 @@ Include "stdtoolbars.inc" # math: the toolbar is visible only when in math # mathmacrotemplate: the toolbar is visible only when in a macro definition # table: the toolbar is visible only when in a table -# review: the toolbar is visible only when inside a tracked change +# review: the toolbar is visible only when tracked changes are present or +# change tracking is enabled # ipa: the toolbar is only visible when inside an ipa inset # # top: the toolbar should be at the top of the window diff --git a/src/Buffer.cpp b/src/Buffer.cpp index e2185fbd89..ac64cf2f26 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -370,6 +370,10 @@ public: + (with_blanks ? blank_count_ : 0); } + // does the buffer contains tracked changes? (if so, we automatically + // display the review toolbar) + mutable bool tracked_changes_present_; + private: /// So we can force access via the accessors. mutable Buffer const * parent_buffer; @@ -442,6 +446,7 @@ Buffer::Impl::Impl(Buffer * owner, FileName const & file, bool readonly_, preview_file_ = cloned_buffer_->d->preview_file_; preview_format_ = cloned_buffer_->d->preview_format_; preview_error_ = cloned_buffer_->d->preview_error_; + tracked_changes_present_ = cloned_buffer_->d->tracked_changes_present_; } @@ -2768,6 +2773,8 @@ void Buffer::dispatch(FuncRequest const & func, DispatchResult & dr) if (params().save_transient_properties) undo().recordUndoBufferParams(CursorData()); params().track_changes = !params().track_changes; + if (!params().track_changes) + dr.forceChangesUpdate(); break; case LFUN_CHANGES_OUTPUT: @@ -4584,6 +4591,7 @@ void Buffer::updateBuffer(UpdateScope scope, UpdateType utype) const // update all caches clearReferenceCache(); updateMacros(); + setChangesPresent(false); Buffer & cbuf = const_cast(*this); @@ -4847,6 +4855,9 @@ void Buffer::updateBuffer(ParIterator & parit, UpdateType utype) const // set the counter for this paragraph d->setLabel(parit, utype); + // update change-tracking flag + parit->addChangesToBuffer(*this); + // now the insets InsetList::const_iterator iit = parit->insetList().begin(); InsetList::const_iterator end = parit->insetList().end(); @@ -5111,4 +5122,29 @@ string Buffer::includedFilePath(string const & name, string const & ext) const from_utf8(filePath()))); } + +void Buffer::setChangesPresent(bool b) const +{ + d->tracked_changes_present_ = b; +} + + +bool Buffer::areChangesPresent() const +{ + return d->tracked_changes_present_; +} + + +void Buffer::updateChangesPresent() const +{ + LYXERR(Debug::CHANGES, "Buffer::updateChangesPresent"); + setChangesPresent(false); + ParConstIterator it = par_iterator_begin(); + ParConstIterator const end = par_iterator_end(); + for (; !areChangesPresent() && it != end; ++it) + it->addChangesToBuffer(*this); +} + + + } // namespace lyx diff --git a/src/Buffer.h b/src/Buffer.h index 3f5ab2231b..d4074b0fdb 100644 --- a/src/Buffer.h +++ b/src/Buffer.h @@ -760,6 +760,12 @@ public: int wordCount() const; int charCount(bool with_blanks) const; + // this is const because it does not modify the buffer's real contents, + // only the mutable flag. + void setChangesPresent(bool) const; + bool areChangesPresent() const; + void updateChangesPresent() const; + private: friend class MarkAsExporting; /// mark the buffer as busy exporting something, or not diff --git a/src/Changes.cpp b/src/Changes.cpp index 9fa46f92a3..616daf029f 100644 --- a/src/Changes.cpp +++ b/src/Changes.cpp @@ -298,8 +298,21 @@ bool Changes::isChanged(pos_type const start, pos_type const end) const } +bool Changes::isChanged() const +{ + ChangeTable::const_iterator it = table_.begin(); + ChangeTable::const_iterator const itend = table_.end(); + for (; it != itend; ++it) { + if (it->change.changed()) + return true; + } + return false; +} + + void Changes::merge() { + bool merged = false; ChangeTable::iterator it = table_.begin(); while (it != table_.end()) { @@ -312,6 +325,7 @@ void Changes::merge() << it->range.start); table_.erase(it); + merged = true; // start again it = table_.begin(); continue; @@ -330,6 +344,7 @@ void Changes::merge() (it + 1)->change.changetime = max(it->change.changetime, (it + 1)->change.changetime); table_.erase(it); + merged = true; // start again it = table_.begin(); continue; @@ -337,6 +352,8 @@ void Changes::merge() ++it; } + if (merged && !isChanged()) + is_update_required_ = true; } @@ -517,4 +534,15 @@ void Changes::addToToc(DocIterator const & cdit, Buffer const & buffer, } } + +void Changes::updateBuffer(Buffer const & buf) +{ + is_update_required_ = false; + if (!buf.areChangesPresent() && isChanged()) + buf.setChangesPresent(true); +} + + + + } // namespace lyx diff --git a/src/Changes.h b/src/Changes.h index 27710476a6..1d55b03b54 100644 --- a/src/Changes.h +++ b/src/Changes.h @@ -78,6 +78,8 @@ class BufferParams; class Changes { public: + Changes() : is_update_required_(false) {} + /// set the pos to the given change void set(Change const & change, pos_type pos); /// set the range (excluding end) to the given change @@ -98,6 +100,8 @@ public: /// return true if there is a change in the given range (excluding end) bool isChanged(pos_type start, pos_type end) const; + /// + bool isChanged() const; /// return true if the whole range is deleted bool isDeleted(pos_type start, pos_type end) const; @@ -119,6 +123,11 @@ public: void addToToc(DocIterator const & cdit, Buffer const & buffer, bool output_active) const; + /// + void updateBuffer(Buffer const & buf); + /// + bool isUpdateRequired() const { return is_update_required_; } + private: class Range { public: @@ -161,6 +170,10 @@ private: /// table of changes, every row a change and range descriptor ChangeTable table_; + + /// signals that the buffer's flag tracked_changes_present_ needs to be + /// recalculated + bool is_update_required_; }; diff --git a/src/Cursor.cpp b/src/Cursor.cpp index ed182ace64..1f84f45fea 100644 --- a/src/Cursor.cpp +++ b/src/Cursor.cpp @@ -2426,6 +2426,12 @@ void Cursor::checkBufferStructure() // In case the master has no gui associated with it, // the TocItem is not updated (part of bug 5699). buffer()->tocBackend().updateItem(*this); + + // If the last tracked change of the paragraph has just been + // deleted, then we need to recompute the buffer flag + // tracked_changes_present_. + if (inTexted() && paragraph().isChangeUpdateRequired()) + disp_.forceChangesUpdate(); } diff --git a/src/DispatchResult.h b/src/DispatchResult.h index 21dfa4f92b..f546be27bc 100644 --- a/src/DispatchResult.h +++ b/src/DispatchResult.h @@ -29,7 +29,8 @@ public: error_(false), update_(Update::None), need_buf_update_(false), - need_msg_update_(true) + need_msg_update_(true), + need_changes_update_(false) {} /// DispatchResult(bool dispatched, Update::flags f) : @@ -37,7 +38,8 @@ public: error_(false), update_(f), need_buf_update_(false), - need_msg_update_(true) + need_msg_update_(true), + need_changes_update_(false) {} /// bool dispatched() const { return dispatched_; } @@ -57,12 +59,14 @@ public: Update::flags screenUpdate() const { return update_; } /// void screenUpdate(Update::flags f) { update_ = f; } + /// Does the buffer need updating? bool needBufferUpdate() const { return need_buf_update_; } /// Force the buffer to be updated void forceBufferUpdate() { need_buf_update_ = true; } /// Clear the flag indicating we need an update void clearBufferUpdate() { need_buf_update_ = false; } + /// Do we need to display a message in the status bar? bool needMessageUpdate() const { return need_msg_update_; } /// Force the message to be displayed @@ -70,6 +74,14 @@ public: /// Clear the flag indicating we need to display the message void clearMessageUpdate() { need_msg_update_ = false; } + /// Do we need to update the change tracking presence flag? + bool needChangesUpdate() { return need_changes_update_; } + /// Force the change tracking presence flag to be updated + void forceChangesUpdate() { need_changes_update_ = true; } + /// Clear the flag indicating that we need to update the change tracking + /// presence flag + void clearChangesUpdate() { need_changes_update_ = false; } + private: /// was the event fully dispatched? bool dispatched_; @@ -83,6 +95,8 @@ private: bool need_buf_update_; /// bool need_msg_update_; + /// + bool need_changes_update_; }; diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp index a405b6a806..d6106b37d4 100644 --- a/src/Paragraph.cpp +++ b/src/Paragraph.cpp @@ -562,6 +562,18 @@ void Paragraph::addChangesToToc(DocIterator const & cdit, } +void Paragraph::addChangesToBuffer(Buffer const & buf) const +{ + d->changes_.updateBuffer(buf); +} + + +bool Paragraph::isChangeUpdateRequired() const +{ + return d->changes_.isUpdateRequired(); +} + + bool Paragraph::isDeleted(pos_type start, pos_type end) const { LASSERT(start >= 0 && start <= size(), return false); diff --git a/src/Paragraph.h b/src/Paragraph.h index 73de6c173b..6f8d248ca0 100644 --- a/src/Paragraph.h +++ b/src/Paragraph.h @@ -153,6 +153,10 @@ public: /// void addChangesToToc(DocIterator const & cdit, Buffer const & buf, bool output_active) const; + /// set the buffer flag if there are changes in the paragraph + void addChangesToBuffer(Buffer const & buf) const; + /// + bool isChangeUpdateRequired() const; /// Language const * getParLanguage(BufferParams const &) const; /// diff --git a/src/frontends/qt4/GuiApplication.cpp b/src/frontends/qt4/GuiApplication.cpp index 8b613794df..d64c9619fc 100644 --- a/src/frontends/qt4/GuiApplication.cpp +++ b/src/frontends/qt4/GuiApplication.cpp @@ -1399,6 +1399,9 @@ void GuiApplication::updateCurrentView(FuncRequest const & cmd, DispatchResult & if (dr.needBufferUpdate()) { bv->cursor().clearBufferUpdate(); bv->buffer().updateBuffer(); + } else if (dr.needChangesUpdate()) { + // updateBuffer() already updates the change-tracking presence flag + bv->buffer().updateChangesPresent(); } // BufferView::update() updates the ViewMetricsInfo and // also initializes the position cache for all insets in diff --git a/src/frontends/qt4/GuiView.cpp b/src/frontends/qt4/GuiView.cpp index 8133ac246f..d228ca470d 100644 --- a/src/frontends/qt4/GuiView.cpp +++ b/src/frontends/qt4/GuiView.cpp @@ -1552,8 +1552,9 @@ void GuiView::updateToolbars() context |= Toolbars::MATH; if (lyx::getStatus(FuncRequest(LFUN_LAYOUT_TABULAR)).enabled()) context |= Toolbars::TABLE; - if (lyx::getStatus(FuncRequest(LFUN_CHANGES_TRACK)).enabled() - && lyx::getStatus(FuncRequest(LFUN_CHANGES_TRACK)).onOff(true)) + if (currentBufferView()->buffer().areChangesPresent() + || (lyx::getStatus(FuncRequest(LFUN_CHANGES_TRACK)).enabled() + && lyx::getStatus(FuncRequest(LFUN_CHANGES_TRACK)).onOff(true))) context |= Toolbars::REVIEW; if (lyx::getStatus(FuncRequest(LFUN_IN_MATHMACROTEMPLATE)).enabled()) context |= Toolbars::MATHMACROTEMPLATE; From 4154e088b0578dd516d6ae951195b354f8f5bf72 Mon Sep 17 00:00:00 2001 From: Guillaume Munch Date: Tue, 3 May 2016 20:40:28 +0100 Subject: [PATCH 13/76] GuiChanges: provide feedback when there are no more changes Remove FIXMEs: date and time localisation --- src/Author.cpp | 10 ++++++ src/Author.h | 2 ++ src/Text.cpp | 13 ++++--- src/frontends/qt4/GuiChanges.cpp | 60 ++++++++++++-------------------- src/frontends/qt4/GuiChanges.h | 7 ++-- src/support/lyxtime.cpp | 12 +++++++ src/support/lyxtime.h | 10 ++++++ 7 files changed, 64 insertions(+), 50 deletions(-) diff --git a/src/Author.cpp b/src/Author.cpp index bd9d12d06a..03025a38aa 100644 --- a/src/Author.cpp +++ b/src/Author.cpp @@ -13,6 +13,7 @@ #include "Author.h" #include "support/convert.h" +#include "support/gettext.h" #include "support/lassert.h" #include "support/lstrings.h" @@ -48,6 +49,15 @@ Author::Author(int buffer_id) {} +docstring Author::nameAndEmail() const +{ + if (email().empty()) + return name(); + else + return bformat(_("%1$s[[name]] (%2$s[[email]])"), name(), email()); +} + + bool Author::valid() const { //this cannot be equal if the buffer_id was produced by the hash function. diff --git a/src/Author.h b/src/Author.h index 6915318531..108a701e82 100644 --- a/src/Author.h +++ b/src/Author.h @@ -32,6 +32,8 @@ public: /// docstring email() const { return email_; } /// + docstring nameAndEmail() const; + /// int bufferId() const { return buffer_id_; } /// void setBufferId(int buffer_id) const { buffer_id_ = buffer_id; } diff --git a/src/Text.cpp b/src/Text.cpp index f6c1d392e5..416a67bf0d 100644 --- a/src/Text.cpp +++ b/src/Text.cpp @@ -67,6 +67,7 @@ #include "support/lassert.h" #include "support/lstrings.h" #include "support/lyxalgo.h" +#include "support/lyxtime.h" #include "support/textutils.h" #include @@ -1900,13 +1901,11 @@ docstring Text::currentState(Cursor const & cur) const Change change = par.lookupChange(cur.pos()); if (change.changed()) { - Author const & a = buf.params().authors().get(change.author); - os << _("Change: ") << a.name(); - if (!a.email().empty()) - os << " (" << a.email() << ")"; - // FIXME ctime is english, we should translate that - os << _(" at ") << ctime(&change.changetime); - os << " : "; + docstring const author = + buf.params().authors().get(change.author).nameAndEmail(); + docstring const date = formatted_datetime(change.changetime); + os << bformat(_("Changed by %1$s[[author]] on %2$s[[date]]. "), + author, date); } // I think we should only show changes from the default diff --git a/src/frontends/qt4/GuiChanges.cpp b/src/frontends/qt4/GuiChanges.cpp index a27d24f580..c168d3591b 100644 --- a/src/frontends/qt4/GuiChanges.cpp +++ b/src/frontends/qt4/GuiChanges.cpp @@ -27,14 +27,13 @@ #include "FuncRequest.h" #include "LyXRC.h" +#include #include namespace lyx { namespace frontend { -using support::bformat; -using support::formatted_time; GuiChanges::GuiChanges(GuiView & lv) : GuiDialog(lv, "changes", qt_("Merge Changes")) @@ -56,16 +55,29 @@ GuiChanges::GuiChanges(GuiView & lv) void GuiChanges::updateContents() { - docstring text; - docstring author = changeAuthor(); - docstring date = changeDate(); + bool const changesPresent = buffer().areChangesPresent(); + nextPB->setEnabled(changesPresent); + previousPB->setEnabled(changesPresent); + changeTB->setEnabled(changesPresent); - if (!author.empty()) - text += bformat(_("Change by %1$s\n\n"), author); - if (!date.empty()) - text += bformat(_("Change made at %1$s\n"), date); + Change const & c = bufferview()->getCurrentChange(); + bool const changePresent = c.type != Change::UNCHANGED; + rejectPB->setEnabled(changePresent); + acceptPB->setEnabled(changePresent); - changeTB->setPlainText(toqstr(text)); + QString text; + if (changePresent) { + QString const author = + toqstr(buffer().params().authors().get(c.author).nameAndEmail()); + if (!author.isEmpty()) + text += qt_("Changed by %1\n\n").arg(author); + + QString const date = QDateTime::fromTime_t(c.changetime) + .toString(Qt::DefaultLocaleLongDate); + if (!date.isEmpty()) + text += qt_("Change made on %1\n").arg(date); + } + changeTB->setPlainText(text); } @@ -81,34 +93,6 @@ void GuiChanges::previousChange() } -docstring GuiChanges::changeDate() const -{ - Change const & c = bufferview()->getCurrentChange(); - if (c.type == Change::UNCHANGED) - return docstring(); - - // FIXME UNICODE - return from_utf8(formatted_time(c.changetime, lyxrc.date_insert_format)); -} - - -docstring GuiChanges::changeAuthor() const -{ - Change const & c = bufferview()->getCurrentChange(); - if (c.type == Change::UNCHANGED) - return docstring(); - - Author const & a = buffer().params().authors().get(c.author); - - docstring author = a.name(); - - if (!a.email().empty()) - author += " (" + a.email() + ")"; - - return author; -} - - void GuiChanges::acceptChange() { dispatch(FuncRequest(LFUN_CHANGE_ACCEPT)); diff --git a/src/frontends/qt4/GuiChanges.h b/src/frontends/qt4/GuiChanges.h index 344f5e5607..1096e6293a 100644 --- a/src/frontends/qt4/GuiChanges.h +++ b/src/frontends/qt4/GuiChanges.h @@ -15,6 +15,8 @@ #include "GuiDialog.h" #include "ui_ChangesUi.h" + +#include "support/debug.h" #include "support/docstring.h" @@ -52,11 +54,6 @@ private: bool isBufferDependent() const { return true; } /// always true since dispatchParams() is empty bool canApply() const { return true; } - - /// return date of change - docstring changeDate() const; - /// return author of change - docstring changeAuthor() const; }; } // namespace frontend diff --git a/src/support/lyxtime.cpp b/src/support/lyxtime.cpp index 3150825d75..5415ac4eeb 100644 --- a/src/support/lyxtime.cpp +++ b/src/support/lyxtime.cpp @@ -40,6 +40,18 @@ string const formatted_time(time_t t, string const & fmt) } +docstring formatted_datetime(time_t t, string const & fmt) +{ + QString qres; + if (fmt.empty()) + qres = QLocale().toString(QDateTime::fromTime_t(t), + QLocale::ShortFormat); + else + qres = QLocale().toString(QDateTime::fromTime_t(t), toqstr(fmt)); + return qstring_to_ucs4(qres); +} + + time_t from_asctime_utc(string t) { // Example for the format: "Sun Nov 6 10:39:39 2011\n" diff --git a/src/support/lyxtime.h b/src/support/lyxtime.h index 74586cf7de..8fa58733fb 100644 --- a/src/support/lyxtime.h +++ b/src/support/lyxtime.h @@ -16,6 +16,8 @@ #include #include +#include "strfwd.h" + namespace lyx { namespace support { @@ -25,9 +27,17 @@ time_t current_time(); /** Returns a locale-dependent formatting of the date *  and time encoded in \c time. The \p fmt string * holds the formatting arguments of \c strftime. + * Prefer the function formatted_datetime below. */ std::string const formatted_time(time_t t, std::string const & fmt); +/** Returns a locale-dependent formatting of the date and time encoded in \c t + * The \p fmt string holds the formatting arguments of QDateTime::toString(). + * If fmt is empty then the formatting of the date and time is itself according + * to the locale. + */ +docstring formatted_datetime(time_t t, std::string const & fmt = ""); + /** * Inverse of asctime(gmtime()). */ From 395d9e09e2c091bffc68de2d12831d01a7986ef1 Mon Sep 17 00:00:00 2001 From: Guillaume Munch Date: Tue, 3 May 2016 22:15:21 +0100 Subject: [PATCH 14/76] Disable certain change tracking commands when there are no changes Fix TODO --- src/BufferView.cpp | 6 +----- src/Changes.cpp | 2 ++ 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/BufferView.cpp b/src/BufferView.cpp index e6a69dece6..883987eab6 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -1130,11 +1130,7 @@ bool BufferView::getStatus(FuncRequest const & cmd, FuncStatus & flag) case LFUN_CHANGE_PREVIOUS: case LFUN_ALL_CHANGES_ACCEPT: case LFUN_ALL_CHANGES_REJECT: - // TODO: context-sensitive enabling of LFUNs - // In principle, these command should only be enabled if there - // is a change in the document. However, without proper - // optimizations, this will inevitably result in poor performance. - flag.setEnabled(true); + flag.setEnabled(buffer_.areChangesPresent()); break; case LFUN_SCREEN_UP: diff --git a/src/Changes.cpp b/src/Changes.cpp index 616daf029f..877c3f1042 100644 --- a/src/Changes.cpp +++ b/src/Changes.cpp @@ -138,6 +138,8 @@ void Changes::set(Change const & change, pos_type const start, pos_type const en << ", author: " << change.author << ", time: " << long(change.changetime) << ") in range (" << start << ", " << end << ")"); + if (!isChanged()) + is_update_required_ = true; } Range const newRange(start, end); From 3465bf4baf199a4f9e3dfeeb24f98751bf0a71e2 Mon Sep 17 00:00:00 2001 From: Guillaume Munch Date: Wed, 4 May 2016 19:23:51 +0100 Subject: [PATCH 15/76] typo --- src/Buffer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Buffer.cpp b/src/Buffer.cpp index ac64cf2f26..3cb7aac094 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -370,8 +370,8 @@ public: + (with_blanks ? blank_count_ : 0); } - // does the buffer contains tracked changes? (if so, we automatically - // display the review toolbar) + // does the buffer contain tracked changes? (if so, we automatically + // display the review toolbar, for instance) mutable bool tracked_changes_present_; private: From 5fc431594fc0dfad0c731d075e4efb7c2ff1981a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=BCnter=20Milde?= Date: Wed, 4 May 2016 23:34:37 +0200 Subject: [PATCH 16/76] More fixes for #9897 (wrong inset-icon size in PDF) Inset-icons are auto-scaled according to their width. This is problematic, if converted from SVG with the bounding box set to content (ignoring the page size) and the content is not square. OTOH, ignoring page size is done for good reasons - we usually want just the drawing area when inserting an image into a document. An invisible square with fixes this problem. Some icons had spurious invisible elements outside the page -- leading to too small results in the PDF. These were removed. --- lib/images/change-accept.svgz | Bin 2495 -> 2880 bytes lib/images/change-next.svgz | Bin 2223 -> 2561 bytes lib/images/change-reject.svgz | Bin 2758 -> 3114 bytes lib/images/cut.svgz | Bin 2767 -> 3099 bytes lib/images/dialog-show_mathmatrix.svgz | Bin 2667 -> 3115 bytes lib/images/info-insert.svgz | Bin 716 -> 933 bytes lib/images/math-macro-add-optional-param.svgz | Bin 3586 -> 3711 bytes lib/images/math-macro-add-param.svgz | Bin 5878 -> 6274 bytes .../math-macro-remove-optional-param.svgz | Bin 3589 -> 3717 bytes lib/images/math-macro-remove-param.svgz | Bin 5876 -> 6271 bytes lib/images/math-matrix.svgz | Bin 4186 -> 3873 bytes lib/images/math/alpha.svgz | Bin 926 -> 1327 bytes lib/images/math/digamma.svgz | Bin 733 -> 1123 bytes lib/images/math/frac-square.svgz | Bin 1311 -> 1677 bytes lib/images/math/frac.svgz | Bin 3591 -> 3940 bytes lib/images/math/intop.svgz | Bin 1103 -> 1455 bytes lib/images/math/leq.svgz | Bin 495 -> 885 bytes lib/images/math/leqq.svgz | Bin 508 -> 900 bytes lib/images/math/nabla.svgz | Bin 503 -> 918 bytes lib/images/math/pm.svgz | Bin 470 -> 860 bytes lib/images/redo.svgz | Bin 2435 -> 2687 bytes lib/images/script-insert_subscript.svgz | Bin 1299 -> 1673 bytes lib/images/script-insert_superscript.svgz | Bin 562 -> 944 bytes lib/images/specialchar-insert_latex.svgz | Bin 3540 -> 3638 bytes lib/images/specialchar-insert_latex2e.svgz | Bin 4572 -> 4531 bytes lib/images/specialchar-insert_lyx.svgz | Bin 2549 -> 2166 bytes .../specialchar-insert_menu-separator.svgz | Bin 443 -> 882 bytes lib/images/specialchar-insert_tex.svgz | Bin 2856 -> 2528 bytes 28 files changed, 0 insertions(+), 0 deletions(-) diff --git a/lib/images/change-accept.svgz b/lib/images/change-accept.svgz index 6241671ccaccae3a537d341c3cf0d4d9f72dd403..df660778f07e771b8eebf7d46392c21b3015dc19 100644 GIT binary patch literal 2880 zcmV-G3%~RqiwFP!000000PR_8Z{x-l{l33~)qdGUMQYv;+1{XNkRm{X0!@N`rpb}S zE=39yy|VY$_uQeVhb?=ZWQ(9hY#0{rJnm!8J@*cE{muQlPCkWhTeZ#2glBA$gr;cA zs#)Gle*WpZ)J>9YpEqS*w@tX2H0|V@4{xsjl%~mFyO8&xOmql6R}V z-^^#T-ENmvdtugg%h~%RO+UPObG`kve3K*z^fudhS=>za3pRIM9VeE>EYx8gntnUu z8J|s#(~INug0xqkLeZ|*ZL^Ilo9)|^$z8cP%qDAgGEU;&`xz56AyUjpw+~I9->2tG zVdJHxf-yG3*m36TX3g(wgyLCa;^?V%gnxs-!-7$eZQHx92n(zXSrhu%w?BP*7))7K z_T|YoWAxATo*hY(ufuke7hyXa<#GKP9!RjO%6^4M;o{>eRLfO=e6Gry2^&b)kP#&`x!sBs2P;SeV|s@<;I9eHvy zS>*LLJl^ed+pcdWDznZR!=IQ_+}})$%7pV=nJ0tr&d5v{>luH>%=-%g*biNb&3qA!L+JLnOJ)%+Wms&Fv7jdvafBhHSjfA-b$MA~@i1wac0Qt& zwEH!LzrNj!bN4WZ1ati4DBkuDbr?p{h`jk*?{9TsucBxVggHN1(k>R;(35k6^!rs} zB!yxxD_c1F{j#!O8KZj+w#dN8oF6DFNghbbGA$(t=pelpP~$U;O3IEVJV2UCn<;%J zzL>=NxEEE|`Kk-(2Hsu(@;Gm~7yjH-J?i@1HgrEyZTv^`^MN*xvwi~kZ&8Rro;`i6 z(F(m2IuqV-X{PM`F-R|kL$OCL@`L02JRDAC)GT;=77om%Xq?Qw6b&U`7Y%8D&uE~5 z(Px2h{44^NpN@;O@k?H7`x>ufqW+FvbL~XN#kuE#@yt8R-FZf6N11Y{(jx@yqq$Fm z!L{YD$_SzO36*|@aHL!tmw7MT)G4%+_z_=>%TosiyS_kiG)ceAadKf9XJ3U-Nt=CH zn^QT?<+n2G^^7{1_-P&byv+Oj*yN0ov1z%+oo4>eZ@)VjUlj9ywcW>~Qksz8ws+8b z2q^VV#hlJA?>|&)G^lie`7`bjP<|LVo7_Ka!g14K+b#?jl#6$|vRGHNX!c`Y)%EwJ z zt}^Es!zCpt5|%M5nVO~|lODfDCmuiU8+U^W^V|^DtRb4hffW>8;e* z5;IUuJ!Wd{rNeVfGxYLkhpbG%r`!u8rY4ijJ1${cs#s>dRZ~t;P+ZYQ@X~M#?PQ2h z2HvKqHqvk}r!wOV_P8V^Z-v!vilqwlDzG0^DAaQ^#XSH%C>Hl)v_^9Y(;(w2Ns;;5 zkzN@oz|wA92*cG>WL_EA0pmDEtyh*$*a&`9V8LlFlE0ErOQjT!z=JIiSP7>X`VLK}qMY}DjMRiO)GNpo;vh4r72^>571F_`lUQ6h1E(&Z0SMyV z(>_GM|CNWLG6qaJ1X6P*&@d$cyau8T#a0Sr9pa(2^=^mf!LgeFnKlx#|Vws3M4RIEE}kbRaA>N@YM$9620w7v$hMQI=57MSkLhOhJr- z1yUL!9&8I9;DX|dyx^P|8WaJ=gi?SQVqtAUREI-H0>M2&C!9I1l})%NJ~bfq(~m@G z+zmW!yhv;Y>>Ed{4|g>Q3^yL>3)F*^_24azpYjm57C>e!7s?1p9E5U$od^(&c2b#< z;3v|BXmJJ+7@i7>N8Wf7OA#FmKzRWmICTFQAcyN~rmmg`i?*)-%k^w|T0Hw>1BY_o zRrl|JeC7}Vlqme#49%Q?gHsevEf~SuqSR&%#p(UztOAQ?EAS6gAb}DwMG3_|7Tk~U zA{QV~l)&C4@iVB>2r+<3?^6!ErU?;->LziaRa7XbMolRp0dE41wp3Le7%C#s$SKXy zI2b{ILy}YVq5>nR0->pv@f^WZ3JaB`6y`({)NyM?#nz!%#Y)7n6oihVO29Cd4H!Uw zDgVleh#^w8AIXi;>9Mrcbxk=P+M~vbtMe4FVbj2GLN~gXB}*Re95& z$#(JO=9viS4Slg1Wqr8s)2b-}_Bk7#^150!^KGAZ{U9hq(RO)XwM_*573IkOz3I43 z9r`|WDZK=*n&l|nwO#pG7I!>k$gp8qb)ks+*L`<&Tero>bkns<^uhGzd*0t(?YgSR zF6p{0!@TZNhz4VuVudThVD0|85Z?u`XOlW!;$F(?{paE3@tkk&uhx0@F?7S=r)pc> zRyD1PA8WFIyQ%YsdDW1ntM*gq7InKjjE5%2zw|aQJ}$fVt|{kvQQWQX=w>&Z$|7G^ z^~3xxtFXRG$5*uJaA2EIREw$@4uEDnTcXxP36`U=1DZXumzkl_Knsb+!&5Dy_DU0U zt!8{*VEm9X=y4#q8vrmrrk4o;{%|hIl==qmkC{-iQ(-?0<@tv zG5M51>JEh~rU|-w8GBiDV)V?FSI?xw6WabG9eztXye-Ng)#CpY{Ag2{;sf}BWSh~I z1$6FkJ0TLs9U_(zOSNO@ea4cAdcb12q5A^eQH_p;4Oaz$!X`AxyNJY3MH~&2Au^{s zUc5F4sseZzD%-xW5z{06(7pM%Rx=mjkN=Xk!lfkE5IK~T(?_UA{=vS>S@HA^@JCks zmaOpd7T1jb{j3-pQHs=?OU*7H9FA7M)?1nBQ9!=HjQQlmzSdNcRo&3^zrYG_@#ApiiF-hzez literal 2495 zcmV;w2|)HAiwFP!000000PR>=kK@J>e&1igXkT^_lIr`=97f>4fq@tSVlVQ{At{L% ziWErBwZGn9HFeHtjy(b+fkzL+E_QcSSAF$WHP3&zU)9lV+4WW1TugY%CQ;esZBaFg zi^-?oeoEXV>W8c;vbt@`i%HW?ez<&h{+A?)e(cI@D2wQ>8kW(|&2^t=>oWSV9ESC5 zI=#EQORJ4AZM((vW0WM9@7|sFw~KdC6hUv(&x-tFvRSac>FO}C$fsppuF7WUr#$7; z$$omipPrNU>bA_=)v9g!u(IjjA589w`EE8@b0@AEQkHLDlR6_Bqo;_ofqZ2 zC+R4skqR&H3L46+`$v}*75q9*8mAq<(MsCQ8m#JvcD|FIUD+DC0Y2=hNduf3c5*e}j)+ zG20l=vf?}WNXjo)_Fwgp6wAip&pIQ(J+newJX(DZ^^pW^v66^h5L@u*sSAq=Rp8)c9-eM#C z)Kmj#?WQlgU*U!FU(Kh!d@}2|E^GRE+pR7p13lKL1RsP>g*RN9n0?$k=_Pk4_UMRw zcW{2}4yRJ$N^g(cfw|<3gSn@?q2$}VA?+XOjRY__a)jeY9eSl4<PKp zDC+nVulnWb0Y2Sg?*`?& z7e|wahjqE%blkQp`}U^G%abi_k*_LRH2rm`>iTC=a^U36rqxiFmqF+FxIM*mbBwK* z4o-PK-TEMm7JJ_;xRKz9&6;&KEVs(YanU|gId`ct+D9x-I9I82j7ck^JYp%clBqZm zsr2|69f5`LUc`ySgXDmdjAZJi)|v;Q2gI3+>WCw;l@s2_*akA|v7<ussZO#^XQ+E^DtRbG6|P*>8;e*5;IU%J!Wd{rNcPnn@TPE zA}b>hEBC^P*rbwq$0ck_6icnQD(2(`#T9LYQyOleoeUAm;Is+Kjx^lMSf-r89v3Ba zT4A+|u~dO)1@?mqg~D!PBk2r^h5Z<<(Okkb$he9UP=I!%R|YPyv>O+~a21QxD+4=V z9LHPhmE|!T&63V&V`FSczQG!XSm2Bhc&BABig9Sw6ap?4k3JvqAw^#@yHD6ny3T>c z*?R`dl{}-tK2edkU3*>58r=K#3Hk^|zeEye+rkJA31f>wtzr)>IL$@$BMG%sN+ARu zv;oIT9Eza<(G(Tsya!~YCX}IYL8jmbnM$n~5BTwlxiQ#iTDX?M7oG_z04bc?Lj-rD zU33x>07_eu7{?vd06Z2T_k_JzG6ar#iAX8f2-Z}w5~)Q9og;_K6c$+lbfnTU1UNCN z0Kl0=%nc0DK>|aV!7<@i&q;-Ju<5`TCt~2#=@@`1K0Iwm^vACZib@$U<={xonLy_h z0q`1#Hso6=kah5f*4DexAKY3aBlH*wslp+HKcvvgQKY;>czlf36KU#VPw=$KZqe404Zh)eFi|MG)mU7_toBkt7j@+(Qlq2$7V513W+i5A#$o<+&L-Kq$&& z0q1ER*vJ?ul>tF<E-`E+quJcoTJhq~WY_aA_K=HLO8DEw@Su1?^9F$$*^ zjNoliYEy^e^l@@jfyJ{G_!laWK#7P^La~np_rtx&1qc)+uy;{-22~m%Mlk73%7NE3 zA;M7IBrddy3I)}um=Y53Cg5mGRn>u^0uqgkX^uu<1OX07PSuMFjGzjH?plU8f~OP~ zDoZKMi6p4?){2U)L$L~#h+`=T9YvLZVJsUlfJRpYRsacOXrvEN66oAXui&Ada84Pr z349X{WHFg=jnW#1P8d26N>k7#Jd}TqRs?qZ!5mZsLB^p{0?CT{5Ln@b2n=V#`Oyzp zBnUaik>AGuw1_`|e#p9E6clCNcG*z1O#uBFq3n{LlB8K|rFU&tJeGwWcNsEn zSX5n^hyClJJG-je{5n~8?E(!kea@T>S7&!!HDH%y)fVNf?h=SbW1D=5yTWMg=H3uK z3b1FBI^5=7%IeK?5{B`s%8xX;pZv$^L#_XAiTgAx&rPZQ0H1 z_HOsSY%=^yuCn}k(X}^CG0XD&W_3eXyfG^CY*p0{v%f9N)mgIr?467OTbFq?uktYf zG~?M4wIWKe9E}~&?2*09jEx3bNHiXvY7w3Z?_~s8)_4hPZ^}{Shzx(psSammqjN=W3Ie< zCLNy8_MhqSE$Q$+FG{KA|EJ(bo5BSq1(J&bzbGqY&YlEOFfWcVVHieCt9_fef&4;y` zxd4Csm$VfwC837Mv7{Uhp&I!I`%Y)Y(>uVQS@A7d;pG*s8UOoP5gO5R`uKGD?sxf? JO-q{{001t_xjz5^ diff --git a/lib/images/change-next.svgz b/lib/images/change-next.svgz index bbc79125eb1dcedbfbc42afe0846cd0d146dee63..8416c3b255ec154d658f7e467684fc54be035049 100644 GIT binary patch literal 2561 zcmV+c3jXyUiwFP!000000L@w3Zrex_efL*zm6rr7w)%dN?aadrW--7n7T8I!&$QUG zIgvzzqGLH_5IB-=XMNct zJD<(&@9$Z$C$h4-p1n)b^!?e{#rE^{S&}4>yV=h3#pPtb;r6atHH`UU7FTf{H}!TV zn3zp^_C?RWAnC>DxG2}_a(k9mCZ$h{-3wPd-_O73c!IpBl+{T*hZ#92bm=@nIjE@Kt2Vobp zW23(rBN=moW{4Lr+V2_vPxUD*E>BPEr62_x|M=hb$SeqRM6B{hFu*wWMQ%fh}B zqn&69i?u>XeK_`ksGJ$4ytfDHPC`sz4xN+tDm;LiD#x@rB9A7q>Cd8WI=`tRy8oMz zK<@ai_r#BzqDCLT+s5j5>V^N_d_2_2p6dh3{T7WE)v~6KD~vvG4f>-L+W0Ad*MsyN z9GX8eQ5*~x$8dPfXgCP&2oCTP8Ux-jG_*Pm4dwn!G%&E3BOtsuLcodPx;$DRv)Z^* ztZowZPqbQcCcPDd0`|~S0}@v0BLq}n#%rnd5e!dxN6HbmK0OH!&Am(ck0Y|q>Z;hi zCCtS-bjfN^CSh#_aUHyBpuv{ z0zc4rq-9Py9DS5!2t4h>z*tJM5mrh)Amgku=D8#bLZl)+so0_&%haVR6|a_Rl6h&3 zRRQUR1e44PX@qmgHOqYPnwzQMfeGQ|cVyZ?Qnu^ z$VDENJ|)SSv^1TaA{d1gqUG~~gSv83og&y;Brh8MDY6ZR$@V3jP39s$VbcDA{8FA7 zEvyd5`GvX;7@a@vVo!NN)o21HaPe#x3qlQyeI~u64jiGX2i$-0^craVg4@92>DB4__fJW^{FLKCNS&HVQay@~_)XM62Ca0bR*%sSJXr`xQ)X?GDQNk4WX z{+PBVBnVO=H1nQw6X@+qT zq?t<3gbGd>90?BG5d%1l3CiO+1nH+5r9>&G65JB7$I7W?iU%(gbW1g74#VUWC(`(& z>7XV<9jAO{7VQDnrno~XD}ur(Dme7rQ=D(gO&5X3 z;q$M=;8xv*4}fT%xlzJSapizgLMA^GQJUZy>`{pw5H%h)aHk!)1G7{>tXM%c(76Db z1^|jFqv2=@l7LCP^|GeBfNDSpTq=oJg24eK;4Gc=3KT?=aYV6Rc-+=0YPe2NW6xKRBr7i;Bc~3~IX1bFI3#J^0XHyFUjNuN>wot@06ez;UPCyz2iGbJr z5R50_dp!m|QvdDKE46v|9o`7cc}sa|G4vy^LrAQp+mrW1(@G-I8YH|@qCoILHg8bvZ0HiPH$q;Dns&z&s+$nbzGXa~5evX&EG?qo$w~um}l- zv{XcqmT)0t5q8MGCfx(V0_iT86$mwHMDN#_!BF1(GD@$j)Hy}d9R zzBW`kE$a91Bh@b9+mdX9OdLbBTTcZZ<{BbcVS`4=hq*zU)>`gGD_LB9Vm*S?nz|8-{Cki`g@)}|9X@dcS@98 z_rk7&(yAK>`smrmkAyV95vBp1k&0AeJvyLw02nSePN4AgToN{;iTJ+i4r1N#egt|U z+PmxE6I+_c>TcDT^CebgXWjTA7PABR;6aBJ&WH!I6`!x74nCHbq_7Qv#2A z$vpN_A9=owyn%_Mz&CHq9s#dT0=~ieuL%6b?7I0^#YH`umSOL@C-6(IlsN6PzS literal 2223 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 diff --git a/lib/images/change-reject.svgz b/lib/images/change-reject.svgz index e0a1cd02558328ec305b5cedb5fc84f74635d287..9a25915aa91b29fbcabe1ac430fb70dbf166e90d 100644 GIT binary patch literal 3114 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 E04V+jdjJ3c literal 2758 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 delta 2754 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 Z=zb~UquTk(J`=sU_#ZY?3${8<0061YD?tDN diff --git a/lib/images/info-insert.svgz b/lib/images/info-insert.svgz index 2b79cdbc38b6459a6c76f670e164e5157268078b..e9980de4105bc54dfd2351fc8c22f216ddbad313 100644 GIT binary patch literal 933 zcmV;W16uqaiwFP!000000F71KZsRr(efL+W3>IinNTMuXBu4T+G+1C?yIb^`5heS*+4=eoshgek78MZ0JacB|%!N|%`O-GQnQJ4IEKw3+6mVH7Cgi?Ee|`TFW+*V0 zN=6$cd5NS#pLdJmmoN%rP1iQ}&8A~ArG();+gAPjel zMPbhSMGyp#R~o{q5)BT=lWshbRWWaP%cV7O5+yO3>D5fHTy}Bhm14vOX zJ+YmdF7>1&&+`~BxL_55F1FO}L`(PF4d8d^S`p8N zJF>kV`5d$lt9d_;hdartRye2ln-xv-)g?heJn4)Fp+gz*O&vu%R_RZS*Jf^jJ8gzQ z#neaFM0OUu>xoB5R;fnm5Id}t2pwcOkNk&{2cvULv!57SdJ(O7 z=j=hts*~36{tFv=<$Ah{!;)Bju{|I5oA}#aq9g1s*XOZbW3LUMwSpl2H<9iRG|wLC zd@t`H14_tx6Xh$MZ`NI(<3C^<3JVzYiRoXxEByT~t&V_qV?-u_8GO)*8 HhX?=w79Gy0 literal 716 zcmV;-0yF&|iwFRej4W0F1C3S7Zrd;ry!$Iu1_9cGp0*QPv7AGL0zEhV07hKdY$Q@3 zX-m%6cS$|`r~*`gVQ^-4cXqj!H_vTVdPh*2OOcT{h=>OwmyC;DMt;Bk@K?msh6+YY zDIg<4lIQJg^TqeQ?+T~^<~7{xy`SP;=d=dz>)x0;4a25s0^WmxRJ-t-=lk2)Y@?66 zndf;}SLl@G8R-M+gDRbnRUFvy5Q7$zt6d`%LMWB?=a+VCktiiWZU644zXab88|aTolshLW42^Ci@^;)NMwc z6|p0S#zuQyO?Pt6b45vPmzxu|*2D7c59G$k5)>6VI*Fs6 z*(vOL3O{fLQ^eT0wKo=;Wc8jh*<>WSB^xe~@cV(s$>V2=;S$zo1>VCrr-z}e-pj^z zl97Uz8g8?FNLgW$U^REoEuFXMaq$m&nnHVH?L^BxH8qW%s%XnA{sHWKGv{&#rSNUw zm-GZ`+%+$BD`KEEogTM7b=#bgS^;j-ap+c?Q;BFHF^R?^=_0Dzr|xK}R7h3PvO^j- z*a5`Ea*5x%nzstztwkuG=<0kLHgS4ztI@}P1x7qcJ>$bo}nUT1^@tkNncF> diff --git a/lib/images/math-macro-add-optional-param.svgz b/lib/images/math-macro-add-optional-param.svgz index 70cbea406ef6cf7c2e5128b4bd4737c3733c71ac..72e611736768d54de8480c3af6403592fe01f91f 100644 GIT binary patch literal 3711 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 literal 3586 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%0DtNz$vf$=%^Xi*QV% zZ8CiVgd+)NHjftOaF_B~8pBKa4Bv^MWbVr>ejclK@&BvZ{i;E-eC&;L1k1^5z{lP= zUnOMz?|z7UdENZ-y7}dG^ULezm)FfNubclsubWYuANbcIPrYu|KhEVJV!V0vZzm*q IPI5E=09a4$rT_o{ diff --git a/lib/images/math-macro-add-param.svgz b/lib/images/math-macro-add-param.svgz index ae78f409bb9f9a06a0dd25b9d609329d7ab65584..76193967021e0be2de687c773802a8ac8cb59b27 100644 GIT binary patch literal 6274 zcmV-|7=7m-iwFP!000000PS6CZ`(+g{hnW;Rbzl@tVGxQp^h`abYlh$>|lZI?%n-1 zP$b&cwk#PE6Fd3!drpy*NSU@6M{(S{vC$prvYxl@J@?#Vk$(M`yX)oPeZJW))~oZO z%*1ezuV(A{Vs&{w{O#Ajjl*!TEvBpabh%#T=fl-{_?I`YUjNH@Jos^wPm6p$xLp)i zgP&KwZ)ek+eDLS1qPUryo!#EvW{XOgtv8ov-w(#)H?Lm3-oC$lH5d%g?`k`l&(4Qc zg`0PqWhywIo#o5?I$ssrGnvV=;lB86Uwp>i7w_}g`ucjk+NPST?RSmBoB74AG)Hr* zQz02+JQM0nsWD27w;xu;^lsd)iZOOoRYHg}T-%rIS88&%geo2!OuE|a9qPZqf4d5` zAlt6rZD#oeYUbH0FV24Y^{3s%vB>7dywOap{Z_xNC0R|c^X<)amT%8$d8*&C2MTT% z^Wq9$RY+g2^2OyhR+2VucIiTJJ(URH9xAA46RNi?P#_)U|kfwZ7$4&W9J%}v=0wlL`5b10~fEScZ=)A$9&$QwAs7O2EZ_0 zPCw+E%IF4X$w=n;#dfa&ely8>a0&jEPd9(xOy>(!E(?{#+E;Y&zN$m3E7mu4*~-Qt zL76z*i?_vxWnNwxCwrTG2lp2j7e6FXwfqy=sItDe*yaT%SB@NAowdjDiNiKp#ACxY zTFS?V{Wkr4%CH~nOh4Y)JpCN+Og>FVcM?_YeheS@-P_DsXZNdjrw&T-yH}YpMh%GcTgtOE+CbFFG5z z*f*eC>)IZL*4piDgE4t>waLLDzB@n(73Jp}0z%$qarb9A68z0%^g$?mj4BICI`{ov zg%2xB>C8Fhbz51{W+4VETvJ&p^HE1>WJ_7fWXcH}TDpoZ^FDa@sIsh*y_DshJ)N>L z6O1&9`ce@i7=iSd0M)6H%^X(Ujx@YnYJ356L-%FFQ4hz&WzNN`AnlREfJa9wS zV=^hUHZ4thlLhIbbuCqnjm{v&P#)D~!>%9IWn*}!GCUDYRLUEC85_`TfvXB%|o5#31J zfW*gj^OEM)3#XrDZc-t#SfNigH_;0>pE9>cW3G(CSlRMo8xd=wX~0s7xl#lL%WubA zFibDCXa`+3V2!u&Q70C?U=P93gp+$QW+%PFN1efcqj0@k*!oNbFXaIl&wzLy3*08- zv;{z9+Y(#`F5<%xOX!DgPWRQz3z}LlaQb6TtsjSc!qmQSg5j+Us^!0uGY(do$NbmC zenjuNGmM7~A)ulVCis>iV8w&L^0uRt_nAlNQn76bL~^gqV}@X2KRSn0=VW>TpxGFm zs?n|dqJYBIL|~lq*2wVvuBGkGCZEp#kr!8ME^L0W%x6U}6`IUphNc}1X)n-hXa~a( zGq3DHEF8l&k()aAxC;9rAb|TcFwrpvrR~w}Go|-S-MPn*Yy7&CY-gaeBYSmy_fDR; z57nt7*F#6)@nIvY#qWu9WW*621^zy(j$orlhuvpeOo$Wd=-9^C#l>6azTAFhhmN?f za%|W@=x5tHL}yR%HSuM2WR7p=dvhX)=%pijWE1}RbwqA;Y}oE7MD!eXA00XO1RZrQ zNG4oxL2A{fS9>Zm$ZVhP%o8^Czo;RkB>Bj&QN})-v!Jslpx2jm7V^)dvBEz=N3a^? zc}TAGQzMjrdCEc(b3Cvfxlt(6 vLk(KG{?8`b`+Ne3^2pIPh@b{^1#~Uk;_cjy! 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 literal 5878 zcmV zKvON7h(rn$6WjUqbIxs2?3P+$OQvOI*ESH7#oPB$x9ZfX`{=y<(}#=m(XaLDYQ9{& zI+Ds9jq1g0c{*RbeRcHHKmIyNN29Ctba6U8UoPrbM~mgrpI*Os`EQfS==)VYUDv0h z_w)6;(GQECuV&NBdi2M4>-FWy@$vij@2mMnSS?p?kG~yFCa+(-czN~f+ZUtJ2<=QRi0d2ebXwu zIz78C&ECAXrI6&DkBuIyPEcZU^>MMDewcJ0MIZYfRb$LCe%qBCR_f%#IaG0HXUeao zbY~(cct1Z~zr$BeIg0A(QABrd0L-cQQFA)&6OYU6I!UJtG}(L zr*r7FDby6}{$f*%n`iLU)p~ikExTz95|qhDJMq=}<9XfuGMO#Um#dR+pa64r_FWMz zFQ>El`s0bT9$B89UDX%{jO}>S!Q*Z}9@uSXP2SgSXGQMs_M7tOA>F>OF?)Ywr{&N7 z#^iB2`XG4J@A~kO-=nX*4}Ld$AM{2keveu?=k%zp?*IM!fBf*5e>(fmYw6ofgFh|i zYq-HLSM};g45R+f#ZOoDty2G3O&3>Z%hkoJqcuOC13CUU5ogDf;J)2Aby@G%*+*0;zKSNxPP*zVde&RP*{%ZHnb&SFthHfh z8$_j(cdHsG`ppfL&@7*B2p7}!YX0GmGB*5MNsh@VK4z_wN(kTXRCu?t)K(#Av|VLo zU!|P932kL*6|>Faq@yf#l?LNeM^`yiF{T*qRhCy7q^ubH;gnUm5$r^D$$)H|9z<&P&IOeMYRwt_4da=88!Q%kRcqFw7{{bb~G{@Gkm%uM?X= zu!rF2(!sqLqmvl$(N^%^Y{DQH_Oa3wMQ)Js3Wygm!Cf*=TL46MEg@9kA~Ef;gkk6w z>`=WtqoEA~r{Cw$hH=P84DB-~7|~18j{gcroV>XE{MY4SMDM9HjJpjX;Xz|uiXB71 zj3tBBC0xoZhT@@UFRP-Pf!0|uiq^>vGv(`JzEb_p{oK$=(@p>_5#hOZZJ%_it2B~!U=2>xoHUZt8f?s z0=N$Y6Fq%U>-R37sohO=?;1mG@i!b~IRlODS*shmcJjz|s9qg~0XjCL5o~mCw}&i?8FL^V?OPZ-J9`tt=UdP0(Gk~G_H`Qw{bWmrXzUTbWxU{bvx{Zh=JW6qN5NVp`+djsZ2;AiPa&k`a_vP<%cxq z9O!Qx=k#{egAQ zMxiNx4i&}s%uHWnpV#TiLd`x$K))Y>zmIi0Zmitj+RX6pXH(PDpARP{0=z3B^dnzTluS(jlq+w?izNnI(=jMsZAhdr@n$gne2t?@7bw37XjC$@go z&aZvP<9}YEMlT>MXf^H;dZID zkXK0ijc9nINbg?Xu#BdSVxO)bSaep~_}uPW3YC_RkQo=m+xUs;b8qn9znRbmpx))B z;Q9AZ8^B+7oxNC?RM9xwI_p9UW435aXk|i;jom7%CF#i`(pnGiUCbJ|P9ujSULaTw z^BLpD*x+>rY1}xa3XCgcJ9br&9Cbf5_2#+*R@-IInr^KCh(j$P%Ya4pH=pk~L9wRp z`U1E_3dpEa*NiMsGTRobrx``AIru2|VU`Ze1z~Q7#Poj5imBRs+G5uJRHxT7_HP5X z4|zR-9Szvx{C(Szl{}0$X$$L~F7`drjs|RKnLQg?2el(JV5{*Uc62v2m+n%YR@UZ_ zw8P0;I|ygpN6va5>7(I!P@?CoJ>+#G;|vd}Zm6aWIXcleM&jWjGMRwz=A*haU^%bv z+UEY_awzk3M|jZKmp#HmTnbfARB{KMz<(_NbXTb)VuG0WbjcDX%7@s3l^)fr8? zJ*YW7fSEtsng$%cbbAk99@3f~b@=k|+}l}g<^7E{C4-#0wYj{Z-ZzR;m@BxqclU)l zH*m?*wKpK1yD`b$M9#IDV*mW+*=#mFkTL1LM6Rc?M;X&St58*l;xu*F?OdhSis~-z zGvZaer<(kY&8u4#ob^_4JN`Mz!)}2{>!j+ZFGIy-Vm5IT|B%LI?;Jk)W;) z?q6x?C5Ub>o01&%LCE2b2T9(8S8oP3_6c~UP_ju9x~owJcH@olxx0(pQpQl z9>^MY^9E)&H2ystV_5e-x0k%{w!q=&wA*U{K7V!t02rhYtm_&8XF4W-TGuM zKg-q6yV+oY>6_&*n2>8bL%Gx03A;62zn))A-`0G~(Z7GVI7j2xKXeMOKVH_mN}Fm| z_0{s1)vWG)@zd$-V$O$-e_YSc&wpSeE#uo%I$xjHuS=WF$L%PNH^bPPPivGfkGDD~ z-`?(Yb3Xl8uePfi+aE@wb>9?ZSB2p1c%qr7Ph9J6+;vqugW5R3>HO*vznsh$w2z&2 ze|l4XXj7|tcI_zJH%eVUyM3orYti%7QK}G|vc%RZ{Hvo$7I>JwvFgRj#kSJbO=nsM zyJJitrTpC)=JXl~_+&DYg0=k>{Ax%jPKEddp)<is ziQ(2@knZTy45rTnHq3KE>Zv*V?THR=Qq0`wG>L#VcCZka%?-PF>)JO}Zgt)n2{v2% zxw{Y!)CK7_jjRrtLXfdH$oC|Ln=MCssKGzD<<`3KfR=mA*xWK>9`?4uwsz+~lzhCk z<@&J*QbH+r%aE-KuImr$R*&qB4n&eypxB4XN<%jQ@ulxypL7X{nB=3u+wjzSwq*309 zsQ<%eWU0B+aQDcXy3VE-^Yf1*;EJTQBcd z^Ywi3c5<;itxwKZll7a;LyOrvaJA;CuJT$M`rC9hy;v?zzng5|?>K3?aaqsiXY<)~ zJzp-aOO5`Fe$sYc9V%tlDN3Z=jR+eG$&IUv2UbYjXFf z_-<=5fB5daUa#xbgbhJqC#>fEa&_7fG>S40vbVbpEZ)MajxO4EB}Q&3_8!6&xLzF1 zW~sGMb}QpasKmRh9&EExXEL(yZ+jeBZ?UhI1y?Crn7O1c@3h-g^>Vs?w^JHZ^bwsD zDnMQ`2JbWCjddeaPCa@XQXG9h;t4+q#^$j=>!6fgAxk##ECOZtq`{4}GRc8-Cdx!I zlC}}|n2mFaXI+)N*Bl{p-U2WzWge}2*~)^aOvR(3b~y`WMsG`f89Aa2l;LL^0%RHz zrbx%4Rd!qyf=nDTNz5x`6p7vRZ!A(}P*ofEK zSumHzcR{!S z1xJFWg63Kh9T zuAX>QAE)5k*0>Yr3wFu_xPU4ztPeJWsRe|=BZ7*vBW948#>6+a<{%<2ZDhW* z;0bzmG=cThlfVXCLLH;B+6U#b&188BgCeD?(+w-VNa3pCYkeUg3GWc%d4)= z!rlR-;xM$WDAJr1!j@8UsRIIeU*!rE38=nE{J@?XdSrMiXcSE&=o^?;>^q9zOc*1`%MC zV@T@Zmn~M(TJV26geNG%L)5(C35o0Yf&IrUDPZ1>p>Bn-`Pjo0q;)#&7E^%Li}h;d zSrY|#ih~arf+vtCz(;QR_{i<5665V zlU(s?1?DjE&;*Q>gv&vrKzhUTOarqk2-4ui}HUTi$V>H^t;)Dtj&>)LIUmjyaY-hmI1R0_}R22z7@OOAv#2_+A zD5(N~Gr$2yfwycBVEAZ82=PK0<^V`nFexx-0|XJb04xQ6Kz;y5CB`66g92%`U>mFt z{v@GrEUp)VC^6K*<%33PUI5@@#)CEmfP8r{V5p2bFm)btq4FXI?IB7bA;vVpDHF4a zBvf{p8xQQFhT$#%IEtc?XyQgh4g(Crkbu~j(k)bqZK99~yk0aeONg!kDS<=s28uG$ zmO?O!1RlXo!4T!ToaMb0zCJSCd=^2U{HWIK{ z5?`7}ii9A_Ok!;#zV{ORBa^s0584_a0>hz=k%Gf^(L7{;CD2DtnS;Bzt;iNu4ow&Y zhgLDN@`#C`Ec2$8P=@(8rZj;es7Zx^^ZGcOfC<198wL)NS)OI4047Blz?<>9k&)0r z2F)OPw95&cmB|1ZMJ_L#C}+bAco4e+Is+9`MuLTTUGPfT({*U<#{^@fu<1l9sxo#z-2;gh@i;eb5d(;PH zL*RC~J^WNT#tI3Ya){rVw1Z4pg(?O^qKTBrb{K&Rg>NIq+C&v2um%uA1f;+Nvw`Kb zn4dx>@Eu=NTx76Y&sUTHh1=zPxxj^h#`=)Qf!-E$b&gntzHl=JQwtPEHjvBIMjm8{ z*1I@&26G}1d zAU2-&_Q5*QS;msY^h+3lcr6h_L(GA5LQWYh3Iwn(Q1wv+?@Z50h1TLN(qV>}aJ}kw zkcFoQtTP!NvAGq{53uZXPnf4CLCMIkw%`-D*$d#?mMG#G#(c?Mz~jhJfn5M_N|2o( zv=Q_Z!n%=!IsLU1gLGf(yJ2PrTc6N@1u!s8|07+b1;S9vq9akZH6T{ z9v(7e+l7E5Y^Ks)!SzryMb1MJ2su78%>(?Ha;-Ewcos#lWN%6-WXHC|+lY|mwHYVQ`e!~!pYmIqDA8%c%)P-w%ojEe>c4uQZv zYw4EylQ7!E^`cu?4%o?P8=cE+Hj%vv>{8Umzz*2k7Hd?=U>>(J+sq{im{Ln+xd!Zp zO9uFt^noKo$|dBW7(KA8jFuhX$^w*TGPw})ehfAenlhJbvQp+GIm34qGcALewY-KG zrumjZ-DUku*?gI1n>Q){#*s2tP73SEn~Wa`SYa;~Rswit!kA`9xHwS>)=Gp!u5 zu>~kV;tJVB+z74^S4<5l9J`L>odClf|4=BE=dI&ymfuA58T-REqY%q&Ze-k)q(t?M z8=nIxP1^O4#x|)a+V?C48)f*IYdgX0`R64MzrB9( MFHbxM7C~_U0O9Ow7ytkO diff --git a/lib/images/math-macro-remove-optional-param.svgz b/lib/images/math-macro-remove-optional-param.svgz index 5dc64732c665a3c47c893b8db60e313df21a74ec..a00414a266498b93f92f482d02694122fd36ce64 100644 GIT binary patch literal 3717 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 j_@C&NII8oRf1&YQ literal 3589 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 p@?aG}92f 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 Kj8<+zaR30Q-%$Ag diff --git a/lib/images/math-matrix.svgz b/lib/images/math-matrix.svgz index f104bad6f37d2edbd2ba605f8908ede2148b4358..123be8068f9eb56452c65bb1591632186b7ea5e7 100644 GIT binary patch literal 3873 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 literal 4186 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 diff --git a/lib/images/math/alpha.svgz b/lib/images/math/alpha.svgz index 267225572aea8669e2fd5139ed20778b3d398775..03f47a9f01b788235bd8d2080f3e784de30ef7f4 100644 GIT binary patch literal 1327 zcmV+~1_XlfFE>WaCvyQaLmgra2)m5)vceDQVcBrFQ-}P17Y+^=e9Qmeb%c|LJ;_u(StZW?h zL*A5m-8Oy`H*Ngs>BG8z-F=9n2$P#WD~nCMABJO=rpK4ACT+J%%Odr)KloV7J6 zd^D9)N>kVt&;RF@^ zXYj&6e(?P()+i|$})owp55$~g%Zc2jtRrn z=rL!Um2DAH*u;5#+~))#-s2~DtgjxyT)tNR6y`2g?UEUPPfzipb>rm|@{G}@WBg3`gkluBnht__dm+fg2 z^Pi2Us)1oO6KxIqg~ye9s_g6n`maRIW%v8`6e`)o+q~}m&(Yr7_OOXHF;W?0^v~wv z4Ms^U6Y9UV^Jt^t`Bj#059*&xkEoeUhy1NNRPVlA+O(|t(skJ6t2#gXZjxJ+j%q3W zwqKYCBRQK6e#pyw$QSdBm{DnP!M4u+{QTuI!ni21zuWG|G{h4e^5^yiq{mNJcwH75 zHsT>4o~i>n8}{&T*m&!7G2A&1=c8YOUcz?%vZEg!Yh`h$!ld-Cp{naY!Xi^yH$khR z_6xX9r|hTN(wpMe>0J6aI_ATEVP(fwY^EH;uaQwiaUqRMw1G%Cbt-a>aE|j(Btj6T zowF_~q7@_B3Bhbaqm>{|F)C$3iJ?j>6|EF;Tx%h2AV!=~%E~Z95-tRHI$14tO*pmI z-eNUoF(SFM+9jM4DvS{-qQQkp#<&jejBrCS0cnL1Cz2VhS;z}nDQW;Zg0+QoQLv*3 zN7+4!?3|R8hwM0TRPPcC5-ffQrHBO|94ts;m|zU?al~0;tV*yi9LJ)eNToOjErvK6 z>bZfYQj|fOc&Air<yG=3MZEVG3uIN6Zomi@JdvN@tXX?3l&`i<%U{(h3o{Mx9E4 zqNyTjSfFm^C_z`L5Wy1cjp zFioU`dR$;@QjiF`34*&trqI%i`^TYb!KscW3OSl5!4Jnr3&bYTUF>^y3%<`MZ-?7; zx`~E!jT3IV7&G?!7ROoE;45!@TP=ou=-MCtV!FIvF2oF3%|Kl>9v4FP{4xwPhI7() zHLi{!lQUN4xNEyEKi`E5XuI9^e#q#IUDv<4PDA#gkrQS?(F9nvT`W`^pH#2pl6n(Wg!x2 zNVJ{g*Y_<&g)|VLf)1RwGduI%JaYT-+v%uYyYuBR^bdt0U8t^ahW60!ABr!3f7+x% zUB*LUO4@Ex|A9r`#%j^D5DTU(xa^E%&#nU)G-&fW1%lSydd0(|n)g8N2*N>OV zkg19#y;;(mb61at*RB~(r=h=0mHp+nRr0xg{F(js_C{}ZN-`o+X|9+z$k<%I_hbES z^S%@_{;HI<))mf{%>T`Lr%wjn4(<4akkb@Cb%*`axWtF{p+GGcJ4D;Id%R@yis#4` zs+x{Y-B`EvSTDynBu=$R0loV_fB$ri5I4>JKg0R!9O9P~>VJn9^e=Wl;ceU8KMv

4UWM{Y9HT3vb= zkKJzSd40UGsAd{7$!f)NTirC6qUU;iTIAWAjWNYFM)+ApPoAxdQie#;u@x?sGcg2{=fYH8M}R`;ZJnrm4icix zdlb`&bDHyX3>@sGOb{XAkE=W-=)q9IQ8d;V+^?KfC`jPs39UVD-~gW9LZX?GizZ8V z)2PH&wY64qU&3pZgeR>M;ZbZQK)9gD+PY1U4>4Z!yK>7Y7!w&P@~CZqUxN`k_9nkXI=MOnkeT5z#fw&QsM=HFEKdWjy`yFA$Ylpuf@9Z`l6uq0>Oa^1`5+?OoI0$O?I^@ zgh>Ky*5TcQRFMKc&o1Rfc!!l(ILgCsn9-NaWIRj-Wnd`IMq6QloWMPj)tVh-vv0ED z*2sLdi_`lfU~O3kHA~1?o`XJ&uQ<%+uwA_OW)1$BzE#`&S=`Tr$491&5E22lF#jK`?4Y4X_?zjI0(a(Q zE4c$ZiM4dmr>~!85D{Fv`o_)F&%3C1P1d57-BDDsiza<=a zxJ6d=CWI2$AdH^M*$cr14J?f_miCM(bKZpPd+@9@0BCA;p3$E$=I)a;pD1tubEC3R*&WQ;SF#Cr zqUq%K-rkI9HzCK2Q&wd8_i%ODgbBq-!Z^!*0HHdb<2d1*BtJ>>@}L1D^r$x@)QXF0 z)tjuBb6TRFtc81y8gZ3&oVXzB$EB9LZfS*=k_l?16SZ(+fhSGYj~YuN5Vj)l8Bfv=HzVle#lI0r(3V>rw_U!f$y8D}Za z0#;zcW1e`N;+Uj7W-G*T5@&H<1c-T`paz)ZobZCjD-=^)aF!%#kO0$1$L#g4b0NnzUxC@f8O%p|6y^KF-|9i9|j0tZcoll zI=D{KHn3q_nM}G`z)rSST<_d@t=a85=}I!`=J+=i`|M#yPH)ZpQf4?ycrh`T7Zdcn pn3twsk~n5Li3yoju-}fD)48`|7T$#UdILcCWVSg|$dzBU`Cmmk>mf=pq*vxd`3WUJBE;Mt6Ot?(VL{wqC!h z!)^{~FCt}GCYUCaLa%_`NjrXox2b-QAEi=^apGea<$qN-qYcDC)o$w{Eqb_>YO{40 ztm;MNb7{2nXkN>87ubOhD2qVShg#`)%^kml&&;&X^%8Hd`uY87KpqQG{WbPwgnk79 zUzu0mKU%)i^IBAEV_WW)s^uFQynOL)=gB2-BX*~qyc8YETG^RbE98gATZ>kOq~w=V zP4gU@jJB?dD%Z$m-*fmqyGTYGqsipT?ARsn2OvI#t#1jdod1Wdsb$qz=vHH4Ew;vvmDm0tsyp1T9zYXHxKl-DeplutxY2Uh z=9;&vIaO`9Y6+gf^D~Eohn*B^t%QG_Mvofs)muE@+#Pq@VSwS%0)i>Zrz|HiDG_0` zU{e6|0^uwpc@bmq1JE3?nBW3UeVBp<5P}%Rc^bkcO8rq5MGUhn2y&JIS|ZF+mW4P$ zDb86+W5`gJPSc_UkQS&+J?+B`6_}MQjbTbq$!M14AoEI^=9KvO+tvAR2qcvDKIY+7 PEGPc};Y4V?>1M4 zVSwMVj?-jib`y4ckvE2E;_#doyp*+rZS0tXc`}$M%6oRlld34HvTkOU^|KRWk*<4d z70tnGjBpf14sspWwZOuv?@P&!)_5w!I5*Wr2sxk|ET3i-*8u1a{(EyRuLN>zYfIe;YZt za>j9dLD&{~O5hg#5uq;~g?{s^;F6_GvSDMiM1KRlgt{94{^o5TeUij~RpQg&R2i__ zY7c(<9Myg&F;v2W$(yWzL#2x7uTc5Gd9N55%ljQ47HyXmye+A-_ez=+nVRH$kXfF; zS5Er0`$aRE^Fg?Dy681HC&?`xoq99c43IQr#u|@}b|9g|)GCve+5F7m0(}t?I|zJl zVSl-iO?^bdm*$8VYAMo-x-Cw#dIuV~64Yi5d-wIO{HMASP-nHNu5bNZUCvN1fyxou zIPxP*2Q#P{R)lRg^sqk)MJd1nDpI3%N3l)XozffR64#7*zJGIwwbaB;`a<6KwJXw=Y% z#MIp#uiK$gK`d~+^$pf-d*Nu8h@l7p2(*OqRR>1F_E!S&Lw?Y<*A+~xJnwqXy{hc3jMosS;?B}hJ}yv*oN)+l8ahKFh~~>kg#V)?A`=#kGe4zKh=1IlGMhaD)xZ6*3RB4#0097w7Bw;e delta 1303 zcmV+y1?c*X4W9~-8GmB1jlsYssnn}l_3QOsK2tD>RRWRmZZ`YtZww(oNOIl2>2zxH zA&COJpAC#vmLIK6 zHao8|B2g5%n7WiAut4>`)X4)HyF!lVTq(xbg|Xi9U#&*a8pTd#dJQ5C8*we)E7-+yI zvU_!{_l0OjP+Aq0il0GAIL~hzRkcl0srNA%xKw#w3n&BV;~o-p$9a4~+K7El;)wr< z)aR~2zj@jSon(nl`i1E<9nfmIIq+u z(M!2WR>H98SKt{0KMstH^?ob*N!w|asH;1binALlOE=OuxgWGFiuWeSvFzidQWs*` z#B3kCD%?XE9ZG{L=Wd5VBdvODiexVo>3~^vk+e$6+LW}go5uoy(sABC!5 zN2uykBYssWhz3sN;V_CuwGa|IA;CPD6hm1^e}7Cd=O_SsNXds62s=EaQRL6C`8t7* z;Vc07TZd#4b5qZG(EbP!R8dI6dFn84zN!D(df zeXHW19GQhriF}5}ctT@B0>=yBJESu)=fRN4pa?^-ViO{Jlub^fJ}JP;eAt1=!q0Pz zPk)JgmbO|v=s`x_NkSYp$tV|N@A0T71zZ_%4KW~}EnEje-HX#a^QzRSmX9Llbo+4I zie?CMfqSNCHM<6>PGt@~)Pffi>OVhJ7B+QWsjQtVPd2jH$FHS^A(3pXzl2Jx4?qli zIoFVG+23TRRZr_aRBqg$^l+e`7Kkqwcz>TLnUwlm(I2ZK>)e#k>AEvAaHFJ0&Th#T>s7+%lQklyX+TN-> zT3N3lPs5$LYhqlW5If-z+%)_Qi6EOVBN6$Jl88-MG_HI|qY%@dG`dP7?m2Mxuz!%9 z97mDQu}99)iT$t6q-p&Z5E#=c_(`klwBjeHlkcCq;qaitd=i`36^Jjh2|vFrgw{eK z69@o{%{048Wg|rk6n+xlE)$GT&Z`j?LtYU~CcthJz3yzyd#S}3bWmR005OTa|{3g diff --git a/lib/images/math/frac.svgz b/lib/images/math/frac.svgz index be54c5a4b15e693ab4d6aceeedc7d3b1175046ad..eb23e882c94840312fcd5e77c2983d5226b0af25 100644 GIT binary patch delta 3693 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 Lem5xEYAgT%a<(4y delta 3341 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 Xzq1w(T<~8jy?XI)|8&n{QYZibL`H4! diff --git a/lib/images/math/intop.svgz b/lib/images/math/intop.svgz index 893cc47be7d51999e3d1419a4a4c8660daa15832..8381a3992fc23a48e0d5294745eb38b7f189c5eb 100644 GIT binary patch literal 1455 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 diff --git a/lib/images/math/leq.svgz b/lib/images/math/leq.svgz index 2b538d04f1263eb036d68bd43d12f7da530d9055..f434ec06a8ea562e2f3538e7d8ec08221e5aae56 100644 GIT binary patch literal 885 zcmV-*1B(0~iwFP!000000F6~mkJ~s5z2{e`?q!RPWl8>s?TypJ4hr$l^MQS#m&UJ;}q-m9I3XfvqA=#8#sAgYy-@kqKQxCP4 zH-cBXk%iZ2@6&d*dFT7+FC)2?0(HtB(3j@5E%{NRKMvL&^C0ND4yzHw+U$c5$oIFa z)uw&huMk3TZqw$XEWFX-crsNl6lEYQSvieP2R&rl0~fk0JoYo$sRjstYIC}#zfsJcCviGSp!sv7rn1|E?p!5>x8qeSe~xz5 zx-Pr~hcqN%^h-MB8ORW?S(?)17ZR#VQXGb9mi;En^Mm?F>QQS(s^(`^tE&{tH7$pp zjDZ#RD}Iq?95xj6(<0=qT{_{cXrgLqx!{&B^n|SYNdpNib^iDB=fMKIEb|}QypAS( zPQYLE37YP0XLuvZ9M-VrcB^W*S+~I-VeK}-Lfnb%@Rl0xH!=n8EzzWbK5()ksspwAwtHFu`HHjp3KOa1PbGT`O%)CTu?c zrWBWb#O7yfd2lfa(7^PhGe}Sakp@ouq4cqh=e2PRt>X+kSw8D-=&Qk)9va% LN&Cz`#|Hoa7m2}E literal 495 zcmVBa#egn2z>7qcS?dmyBa*17c2NtfiJal#~sGQFhqJLqpq*;SAbBtS{3$OtpEUi zuCY5Q_HZ^FPkl2ArNF9DtuoGH5)lj+xme^POxI^6y0-0%9i7I0z7hBGa8-xb44Y9z z@;t{e#grniK=#cz{)+Cc{*515X&lGc*B0e}Rd=fm#Gs|CJ)~@ewbE7X7OdqSdM|~g zM}<@e8`y~tD1iWvrB*pEx#LUu!fZ#cm-u+Q=O2#~@>q!7pRRwIq5pz_|LsnGJ}j?v zA;s>{^(}X$Zh56bmTx|7ftSLa*u5Rq(sXLuE8CrVp*}pX6s-;>{L|^Cc?v`3ST{|z zYg9SToPIAU@El_fiEmOC__Bi$9l5I~SJ)27v&dhDC7U(dM2t|9<{)09EMhdKDFrB{ zL68u(MwCV=%W0Z`dos>hPLivQY_I2UDK^6DPznFXq0SHkH9-qVc$%B3z&yTE diff --git a/lib/images/math/leqq.svgz b/lib/images/math/leqq.svgz index afb0e9da0aa8f90c764061cb51bccb65475e988f..3ecbc83025cec185ac581a02de83623cd490c970 100644 GIT binary patch literal 900 zcmV-~1AF`*iwFP!000000F71OkE1pae$QXwaxbmA7-N1IXvjTub<#vs00YT2ClzT|%=djWo*B=O?Z@|~MsLz|O1GsKV&Wm$R$8d`PMU;suXQU+uhrhi-Ddlf@1x(1sQD|QN}FK-RL6t?hykhk>`st5seNr>i$v>88Ftde`KZH?lkNN_N4FkN$TzJOI5C_6R1;M)N4u z;b>P|iPD1-=w!G^#S(?!JVYjp7)?gSoN*y^HKb5_wfy=OLxiih1HpC?46JxlvLD(xcy#y=sB*=RRjF{DER=JxQ`z0^MI4HJ9BTbw5;6dV5}X z^8094t(($IF$^Dla9H(TdW_5P9-b zcn`BALVuu`!fl6HoIb@Nj#=TXKSKCB`p8O@^{w%LJ~ a5o95WS;D4m*$xxD+k68_OcW&K2LJ%2PrwNP literal 508 zcmV)t?k~t~Bpj-o<^t0vcD8Z-3x#JF@VHiTSkfG^o^ce&}wb_*RTyFpX zey+AV!S`@698Y~a2?a;8m7Ubiq9}|IT;+U~^KrU5OK!T(XgfKz{dgnp#o?+RZ!^S` zD58`iOb{V~R|NJ|JN6RXTm2p1vl5Ik^0ig@U)9}eM`BRIH6D^;f{j#l<5sN19(pf< zl}DwJ2RpJeKcWNzG?hB(m|%{rhr0`}LO{Crql z=~D3B!So$-mFie6$1Gob+7hjWJF$B`%C+g-wwKnNdM@96Ucoyxn$S7SyG)dYGa4LEx*mw4^kgj?*_zIyn0n4aFBf`gqgQ8Hs-{tGH(0jarw6hY zyP0jX>DfS{X_|V(_k7<4hTC0R!!Pc$DdhOd)F*^^fGy1b$I3cr=n>wTJ}GdgPP&vk zu#>oz#(VqrHiIs~!iWbqQ$L@gJ~g@JjqHxRl$|%}2m7ZJwu-(I<^ZCf4B|mn`-55J zN)!&1;NOMOQ#N}cIHgEa7W?7Am@>|UDs2idCwyCT3@&cY1{nFwu&_8+vbS~!9r+%P zuvWToKJA9bxdU6Jh13%i4bKy#pv=l#A?H!8w*Sh~7*$Kn+Y)l1WJLBFs(qzDRYJZ3 z=8A24bD)=Kci=+xh2wt&`>F-Nof@6Q^aqT&_asavim)9V8#R^P9aL{CDV!azJNePu zO{u1EA{-<>rBU(`E-!@>5X@*2r15tkR2M~<_$;8&57NB6Xut@)>dgo>{8Ba5O^W55 zmZ&GKVawf`U!@-B4SB=32)XN)R#+*Rphg-lxZw*tY2snjfC77+{rUFgE`eN@**{9Z zk0Lylz_;oIU3WIKIu~UIo7ix(sTw$1yTrf3=H=c3Jdw@yC>N)9w_4s;`sKYQ%BHeL z-e0Dw>#sJ*Sk{Bn%G7dE=H8h7Sey4yT<%S!57LpF!`;d@1yKUS5JXYBrf{@0io+PW zNr01-v4pM(3MfwEB=y5}8sapHf`lO-CoH8wYGHzD95NEG-37m)KTsOrC}K%S*M5Ro z6bB?mQG&z32itW@F-wyOxPg!TIE{lxUX4N@vm~IzhPXY<`<}X#2H(wyYFpT9rCpeo zGdCwK?XZorpaB|}!(3}X#$CcDqiRj7+*Y{zJt!`@o;CwdG32j6`HoFIRJn sV-}Hc)Wbf)55i}ZG8VH@X*Ur=8%Yc|fNfH4hj_F44@2aXDCh?O0ApvtVgLXD literal 503 zcmV%NboB_zf~ZV!?}HyM9qc+cd4|N2lpOUcjB)o$29g zj=>1gG);-m2xFcjy#CEt@#n-GesjH(M3P&w%ytduS*yJ#)9 z$axvcoyw%z^+R>44=O}J##W=Okiv?keX1m**C8(6=Et}DNjY5y<^L2NU^ebzMIW zOXgS?L$$3{KJJ`ePbtV8V-86!QfB0I2BX>wTTL!^I!{1-hC|LHzNQRw76*O^4?q(f zrIGt7poWlQp74}K>ome?9EUuH3LG4yG)&?9%@ObL1gVb`KT5(ii!e>%GzuXOam2%f trEAVH^EnG3;5cA34(J8;aQ4DGTJEx>9;MS=XT$mDtA7C2!%Uw2#dSz{@Qc5KU# zl*#4mOJ8Is(+sc%0)*!rQY1~vo3H1#@!o|tQgxM25cWOM)r!k*U->_Od<$~lGnRFn zHL4Sp-zop=_Gx3@_fMYZfpcd{URVCX+P)0K{-_(I^giTuC>qg<&YF-Q68fvWUgfnG z%*uCBtF~3089h7m4ZulqdjON>qj?Z=f3T}9dF4Y1bTZ~hf_R!l8BIoo%edsK9#W|MzD3}F z^|wH87JA_LyA-Fv$@6-)hxgYgUHM;jH1vxX@v3wlRqe^ER9i2D2e_c=N!SC zVYPSqAVHl z8#tl}lOm=Qu>`t@2YnIcdFtIp2^^exSFZ&i%26ESJc*~Ak~AZE;RP8+F;4OJo!M{6Ah zuTJO&rrDOU!#IQe*P31K!VRd}?ToM`cGzZ)(aWoIM4DKUN7bhK__x2 mKM$8MN#WigE-0)bd@%?G1m48hq|GqJ+o#{vEj`Ao2LJ#g;I>Kt literal 470 zcmV;{0V)0;iwFP!000000EJP@j^iK@yw6u4_P8-G8v~K!xvWOo>pnDRFA&FC8zP$| zGxPO}ABhubq~%0aS9McO@%+}c;B5P$@oonxA`n=oy=h#%gTH^hBocxlRL)ebcXkJz zhtK6xF`Vls06;XmVQcgb9zr;7F+QI97Wux$Mq}IB&blyQiYSJwT(5H7+bT3?t9{pb zH%v}9e7O_%W`9#(E*Er3ClOUjVZtzDNmL}my9?D@@@S23{LIP-Avo4n<$qNV`x%K# zW5OXqCMS5XO??O}Zp;owFN0-7g|Yi#WM_Uv83cGLbv9I{3e{S^GGg*ZNsPDs@$F?s z5o^7D_5I%k#xn}4KmHWw!}3NKMsN4N@2XHXT~*sL%h#B;z-!?_9Nv$1Z92E@?ch(n zwx52l(Ool|@Xye+?e}rW66>yM6IxqNGw16y1zut-A@Nw0RML@H615y`XpO*|J=Dv$_*GQy=0%ZP>lnATT}KUF^c M11BN3x|st2026%M=>Px# diff --git a/lib/images/redo.svgz b/lib/images/redo.svgz index 8c3a3c3c9e3561c5241f1e30e8d8033b48c1fc33..1fd36f08abeefd55386cb7daa800db384a1f0be9 100644 GIT binary patch literal 2687 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 B)XD$= diff --git a/lib/images/script-insert_subscript.svgz b/lib/images/script-insert_subscript.svgz index af3e2cb08f9baaa6b2b35833bb43d7b7f471b615..1bbe2105a57cbccca31c62ff8e250c3d011e3b55 100644 GIT binary patch literal 1673 zcmV;426p)$iwFP!000000PR>=kJ~m7e&1iADhQCEmPAsNC~55t&;|+e+NAAcp_OQx zjShq2uD$!~JJc;pUgT)gqKFN{;vAfVABRJ&U!C&IxaYDGWw9}_jZA|VNtudbw=sYH z@Wu*Eqf&8^##veLjaiiDtDCF!50+*8EP1SWY8-{y8}EvbRT3Y#@nWykA#$AK@o0;d zXqR&5yfiH9=IUx)-S4gp!vMQQ6{X3>Y!wc7GOGpC#Nipwd7&x?+t@J&@njHBv~_XM zlQPfCqN+8E>e)zGrrTaxdvkPaAsmLGgNQ?j1rk>EP^kE1O;y3iB~^kDa)38TewtKN zK|&Ak>%}{QU6pq-;akw-cEOeN`ors1diRpA)N-Bo}ect3#ad%IWB}{$zzU z;V4qIham~-;hu}#UJYZBZcGS)G=p}gsGkMdAvPp-8S!d~&f_R86YT;hCsG`gC5nnm z^+$Dg+YoG+^wGQloprCH71Ddbk9sDn^Vzokm<{8$lqr`T%dbBZRtbR% z^#D<{FERQYX!m+Ui`;4-r{!^Dl5^%!6u_{$ z)CUY-kmy$fc|j)v3(_Zwge|q&mq#7S#@xnP#m}dEEX#ajdbaBlA2D{$PEH%s^=wL+ zi-H*w!V9p?e2mFVv-R_|kb#!9l$@58$0w1CN1hG~HCVlq5;ne-#SdJz5Hy?`FDc(v zLoW1))<6PQCJG+Qw=zxzC^tfl*p%Z2kc69-zphky=ww^O0|jKd?A94p4;gPbRt>%A z8EkK~-CozE76}m^sg&Do#g&e~@f=J!Q$N1IZHs=2;}-iCuCE=P{rV~ADo$e+4-3;# zx7s{5TlZ0`YBm2X^}y^?D}}l*K$&HzJ2!r7P->PzJ$x&zK0S zhXWrbZKjpHsjrKNOq%3ED>?6#$g+3ZNFR1TsZbdoh-;_yzDv$1xV6)TUXOM|N@_6U zE+4zjfPxxR=}0za{g}aN`XZ#Z?|bgbBB9MZM1z;+1Q>cM+LPKPPDOP94xA5qv4*w# zdQ;w~nvzgxJJGJd^}1a>Lp=p5M_}X73o#qSpk`Phwn^Y(Z{muc9J_>_JJUfJ*&bto z9|Ym`7M3z<&y9L8;Jg{iyNpLgSv)g<=uk4xxsI;UpG}13SQo`LkdM z4am0%W(fkYb)-1GfcAm~Bn-V3(qG&65R?#r1N_^JuoVS_&=8&BVn=<7E;~;V_TA8R z|7jQezsUtWHSLGQCa#ZH9>TDAfq!lp&dPtwG7Ub*@&b&}48|Dyw(G-p3}>wC!5GOv z2m+9zGa$Q!&Z^Pi6y!>OXbWWSZMO)W19=g)il5ZTBlpZ92AgE!iAD$e7We|kOV&`1b*4I!E_!Wy7GdH&ZzBupIG>2D znQI&8B72B_5(-#6&W+!o&otfxFwC2^0(Xny06UL*9(NnLR)f%k5q%yYx*XtrEJa+X zrJ!%iEbY`JSINE;(&@J1OzesXE{9Uh^Kz6z!5z}d%ali%wA5{@R3v-oL>jGW@tT^sF3(9z!l(f)o8;)ueg+7cww~mH!=9Ps56xRVU9| zI^oc$!~85X(I--T8BOTN$$M5v>kzj5iaL;4q)!)sX^GeSDa(d${8_^iMD=ofG{@`#T}*k@Q@Jy9*@Q9r1& TwbpM>Zm#|U%`)76?iT<65Ed?1 literal 1299 zcmV+u1?>7CiwFP!000000PR>^bDKC6eb298>2#)@wLlUA0kPeg?oK;>-R{RT0by&3 z!6TG7&adAqJ`5Nq+qB)z&Q6nupsRaz&$%2)mn`4h?+WWqs9IL#$|erBEm5XbCdS=n#aSIeIevVKt_(IT@BQg5vf<)=DL_QHC#)p{Sh?%{B7 zWM_0LwQ*lt2(7QKmi67{%CaoTTh?)wuIw&gf2)edF-u)hh@B{P?GlH$_TZil?y1Qx z??hVdc2!w7k!Ag2)yGmN_h=dl7%zoVjIj%IgXceb zO-gGF2bt+D3~AU5w?b~VdKk-WWkW2r*DzXUBCn0LwVM%ZCSaY+8LBqMWx~wKndshbz`dbNhBEq$SvAguVeU*Db3r)m6Gr9KTw zjYD!%-9p|INAteZIIq+$(QCO&Ho~arXV4iWKTS-W^>HtTMcZYSsH3%8@uS82p@>Gm~fMw_8FMRF91^o7~}2ZRbtdaQ%*3)ZZ*6#qU!ThV+*C@WCn@*) z`xM*naD1}duk6qvkslF0xE)tEiikr)kN6WPW^v+Ceh#MBGIo5m1%`{336D zn!zCWcBpO(5tmi@AXEiALRFud;a5>XG;kshhfy@)LP+R@1oL1+yfZ)?Hpv8w@%MN%hyt#RxP}~nXAjqbPw^EsyCTK54FXM3H4ug%)*A}6U^GR@?%i$(FXFccLF*jjAJsjER1o7hp?-C`GQePr{Qx#bsri4zn zy^|?7N(#9tW9W>Pp4a7|q=p6>?W#<~g+ltK3o6qsv?OiRw0NTmy-!pEEp2v<`u-WU zF!myqxlEz$t;&;^^%ig%?JQlB;}Hq5GY!E_!!L*k(0rMQ$bVEsY^I_q^RbLVOn=De zNf~j^fxCx=?Cdy-e2zVGNlxs4btcXEKT?6Itb!l1dRkWe>~!+|OE(-Ib(qgm6MLe> zkE;p4ye@>+LLrj~3KpAX4wcF#hPF`nS$cb1V0?C7O=>aL6~Say*nOh6y|4K$wV-*S z@NvV#1%-7Y&V36nc;LX!^erDgH!yT5bb-N&dh>&|vjXU;u*ZW%_rNSKgeOY<#y4P& zvHH|PBm2XwLt?%^`)+xvU_)Oo?nGH-+2salMl6mPS^j~9>Xs2s!z`oGPtrU+Xuv={ z>dipa>?CXXF8I7p^Qs4}Vey6$Zzc*V;Crn6>tBWu`NH`u?!G_Hb~xDnfPE9Rh= zuv%Qk{NY{4%UU|8;4dqy>Z@C1DC;Vyw3V2_RWM{f)D~P7w+hD6d#h!3fAMlnK{Ur9 ziL!`3hY3#dC0*u-Jf};X!KFngN+=HduV(_dKNIh$MoSz&!;7K}$Fm3ykTXb#{A=R< z>ey%rO)gEJ{~1!HQ9c*Hn^i%n~Gz6s}0wcQ$F z3o>HU`u9xPBC9Bvx;9g>t}Ns^QCPIQ+HCQA^l literal 562 zcmV-20?qv&iwFP!000000IgF^kDD+QyysWA-b<^-HU^RfmavCbEA6!(>e;oO1TEMR zc9Pxw^?e4ikhW4UMT*4CoAG<|9LoFWwm~P|x!Rfy<}|`c8);Q-b{qWt+XKlka$XoE z8f)|h8;kF&Mfr{p^r_RrYlY6W-=jzK`10tkaEJ}CU zEf7M`*SJE-4IT}LW7qUTC7Et?tBrSzQ_k=tmy=wE?)6Da+qTxY-f7&;Ox&sMn>tK$ zPI?i~^PEL7i(>)`;$Dmw&*a()GycsQM^VI}HYxw9x>{`@&b9J;fN|Ety{>nAKjB(! zFnD8J0VoWNNICz~z*4r5 zySVAS(Om$<9)yIY6nuc)vC)M-X=9bTbH1}rx-jqsUatSQY*|8izRGhBLna|wmce*w zIz)i^5>E5}8N$sfWL}y@9m}vaJ{c3xUo!-#Kl85R|CzT8f5B?;3$HR1x~&8N0EYS( ACjbBd diff --git a/lib/images/specialchar-insert_latex.svgz b/lib/images/specialchar-insert_latex.svgz index bb5820bb66dbb2307b9b9418bcfe7a120f4801c4..bec519c0fadb1f63437a9a315af1a3b91c470fb2 100644 GIT binary patch literal 3638 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 I@a-S~0KSv%RsaA1 literal 3540 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 Ov;P8(VVS@yEC2v30MTav diff --git a/lib/images/specialchar-insert_latex2e.svgz b/lib/images/specialchar-insert_latex2e.svgz index b8cb25b11f216c609467cab62f8c2a2fb6abbd2c..72652618b0cca4d9ca6327f8bb1724db5deb59ba 100644 GIT binary patch literal 4531 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 GH2?qzyAetN diff --git a/lib/images/specialchar-insert_lyx.svgz b/lib/images/specialchar-insert_lyx.svgz index 511b526f8bff4b7a9280c35d227cc42e20e7e00b..499c7ab7b15a154bec5ead5ff3c66b5a5e035c2d 100644 GIT binary patch literal 2166 zcmV-+2#NO}iwFP!000000PR;xZ{x@jzWY}&8U&LdBGvDQ{8(T!SYWT&O>zu4BrP#R zkp@Xywts!T>TXJw*Awh9hX|N~ySm=>Rdw;^hv!3=JvHOh4*l(l7i^U^eKpi=zq?)i z{nwvzx5}ou?CY`{`sQ}k533*Uu5SL2=h!%RpmpI{b@hX58KV= zcsv$uA{N8A+x$7p^Si67o9StHm1P<1_S3emZdXa*;c@H&V_j{Ut~oUQJZ*TvH>)#y zb!M-~di&H=!{IRWQ;_VZPj8sV`u@aC-W+9M;@r6_#-NK`P! zHn=-;{ywhlgoHle--&%86w~lHR?R)+nxb#!&6i)loGx=#)N}nt&63Xxs~1V`%R@6g zlvOir7J87ss4x+ZZ9VUC6fPY1O}pFA=W|=%t`LHVhootH(!vVQvyn?Hbl_M#-qu4! zEtLNL5#HBLQ{^kzB8TB3ao<9gYU44|3bag17+e7=>)aUw~%{`7I+CA^e zmu5`B%QgWfb#p(RQ$Q!RTpgOZtjoDPUoR9JAO;pR`1WsKeu^iYt7`ktVf>bk_z^?- zb$CR!S9d4!OYY!+Xb@N})f;XG<#Rc>H^3a@>Mzv!Td;7xyS67FYgf_p- zZP)!wMp9UBl(uu%oQXG^6P`Kk>0h!qZU+9vruxkz;U2IvuVJ@guSjt1K*2MyRaIWMMq#Vr}3#M0lnO z$H+)-3&t%`D(GQaLk`K(%0$i9aN-h$m6Vj2G`G$ryj5^TYK?2;OauW0A$8DTxjG+_ zSrc;10{V2`~VZ2SeQ|XMTt-sXvJ9-QdlHYBNQr9?h0)ItTh)@QOdt4NY`4x46~%QqVg*M zlFH8!qsh*85S>6Jkt1WE7g|_wg}e?)Komfn3VFm;JkU^CoPHxa=}WdnAZ z^XDUJ3MCHMmCP=EuACxD2$l$3F|q)0k?PO9kUuAP^rkgO;)A!OIrvh z1D6&uSqtMNfZVynWvq?OD!mn#auhOgII0UcFvna(tt9xa0~C#=#O4}S7>Ri}ZnNAJ z)ccrF9!>KDzZAqjM58HQdEWK?QPVX0GS2qjyLOa#nHv9vOY2HdzbJ~_wH(mYTh zg)-q(V@d*u6jNvjBp0(e5V&`QROM4j)4UDMKvfiu2MP36C@NIx0Bs%bwXurX`M0Tw>M5DjEvnXpgCcCkXmnTFYz z(d;v^jNAnQO9(rch(bt(j=(~Sl}apzrYvSL4OxZPC{935bD4%Cgg})p)`-Pvwx)12 zPtPKAI{AmUEl#P>Ihtm?Fg}u8l2ibqNszRTM-zaT2*m*!FnOY943AStUEyi^1!uiY z@2W5{M_i|(B1x(Bw5P|2RI%ij6q3bK$A>zk+n`(lGR~V+0vd}%gQ$+)(l~cCzb+qz zFhVpzoMo@8Ws#sQgBA;k4m}a4`K80=bC2a_`-z3$H68M_J8yYBj*nfl?T7vq>-+UI zkHfccY|h$GJL1sy*ye{Z$F}%X&W~e5%jU8l{dTvZ7ErXPSPw)X8bQI}?LahIWv0M; zh{sk%Y${Ee_l{E|U*1FsnF(7^vWa-2f!T*@2C724WAM66P;DLd?x+Iq6I}6zwg*FV zE0DQF>N#E@ylAkAhuUD+e~?$ne|I|G=YPOf9sWjEv9@;Cf$~(2ZQ0Kkv}5?_*nSvo_DeIi z_n)ux#s562qmRV$lTfj`MZb%yTp5^sU?WyDfWo zzCPkB@RBgLGycvGL)~nNVBw$ zGGihZxW(Gxl||LLM*n)lJbKI)+%i0JwB2ZH!V7Sr1q-^vx?;s!04jQh09q_vAk+H8 zFkQr2(8HrJ;fcmD(-a=qGZ8`(6N)yK3mb4qVQ47#&c+*;XfOitG&tcAFm0?SEPISK sDVey8_N+oU%s6i4cMz`rkMREygx_p-cUL#`#d~-4A8~J5DjpO70NgVi!vFvP literal 2549 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 LOLCCCq%`6& diff --git a/lib/images/specialchar-insert_menu-separator.svgz b/lib/images/specialchar-insert_menu-separator.svgz index 188269aa9f780d269f64c17c03cc27df30a659bf..22dc2c46226d1a5de4d028e1a1a7bd4d14d7d0ae 100644 GIT binary patch literal 882 zcmV-&1C9J2iwFP!000000F6~kkE1vczW1*{^l^f*c|(WHr8UxCcW1T7mD@InrvW3| zNjmxUTM!(Q?u@jSBBj2ss$5UA{{GRm-a%+1RbTrAVc!!yQ(X4j+W-6KkD%~9V`5}x+mN$Rw4xKeH6cMH^cQuus5337 zl?TC8*Qwr2mc4ntQP#YO7}v=e5aOqkH& zll@(rM&Ky9-GLYtleiOdyR(ZddF?|A(M6a&RaY+Nec zLOUv(&K;$o1k#=$pBYwfzXY>ZwL;ULL3{+y%vM7s9^re*#UtWcjWN9IMGslCqg)+p zKl)4_We-H)nt=1)X}G@RW$rYfGuJw~tj$gx$3$wsp{)_0ot>5HYCl0~j$<;n?1p9^ zwVx$l(9uj|nh`D4o zCb@O!QlF%O+TBu>Z4xAIV8$YO1Y?v$Wl^lM80A@(BwmnZ2 z57h3pScbvaQ#-yNR;zbW_3-6*x%?02U8~4T1GTE2;hDuvGYJdlhC;&ycMd;UPmb?R zUmn~!ZDNMe8Y66lzod1u;A8Yq z?JRKpTAph}iliuK_~zM0ILmW~!+OHUgCu2=k<>XpO&~6^C@YIJohr2+M|$)0AD|=}0V z>tkSMnUPisT&U`*ZmR9->2(~yMNPIhx`q@H2$U8^_PVX%?_bYh4uN%COFkH_YN!o- zY7UjXvO4p(TTfmUr!r{aSAuQYzyQC zO7e`7EJ!1i)0`#|2orzfikz_|2w8$+O5!XAB=9t2F)P437(qxGO4B%Fc|brIF+{U8 lWl=yAlq4jH6K@D3--!4(1Mh3LYFT4*_y@5k>Mu3}002&R(s=*? diff --git a/lib/images/specialchar-insert_tex.svgz b/lib/images/specialchar-insert_tex.svgz index 07442561d6801122f0aa6454c07f253a4b8c6e2c..14bfca9d835be817daa9ea64d00c23f389f9c482 100644 GIT binary patch literal 2528 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 literal 2856 zcmV+@3)l1?iwFRV&?{B|1MOK^Z`()`e)q57YOp{CD^gv3w|oq+UJNj=dtjdxiMENz zk|8m%onJq7QHN#ECW9nT>pX{tiW(S-fkz+q-@*cZ3`Ro4=UmxO_;r3f5h`gSG(bh z#e90R-rUdntL}bw+mbDRLu)T4`xi%(`{##tzo~4yX}9Z-n|b?cco*~gjuuV+)pyI~ zZ*+*7b+BpIFWW0VQyvE^CTfNnIXSTMVlw!ErQ5x4mb2$}1A}88X8ql87&)%0!NkVp zV8`A!U_IDanQ?8KRD3c8pLdU+N5e|mmv*u?#ogexe_o=|H)z-NryKq|C!tphqbGuoeZ~M*q1B-iyoN5a>H`aPPt|2!j#uWWmXbS~?sJ0Fo z3!#kboSI}Hf0eQ&haakJO|H$+p=*nu(is-VfUkRcCkJPrdc&09I${&uiMX z;pWDemudHfO_M`Duwk4^Q@{pEuUx8mh4kidWQNy*O1^%7-M(mfK0;kktPi;!kOZ8+ zwWU6tU%l26n*2s}WMVntl0RF*kySi_g6@xoeK01%VZROtzOE?UaZbRHp-G7t10^Jd zRAI6gW}!exq#Y9Z0o@kJ54cS%>VkkyawubWOh=JyA~`H3O%RV$3k`&(M3V3VRz-va zXEVzLn1bhL1&qZ^uvH+u8{x#9cU)qrBd4?gLLpisNfo?AH#w1A6i#&dzC?~9pt( zZZwck50TwCA>DcQn8Pb6VKZ^QqG%X$2^~iWuc8$S!GREHIXNb=Oqi&T&xv(1~cou^pZowX$oXUFDlB47nr!t?kTO5-nV2Bz7;Mb<; z^d!?GXb>Fn6KAXjF|b&o)-DKgTvVPc{Mr>h%xQW9S2;G1N+8ECc-h#yEK8Y1ik0a4 z!U-LOo7s2EDsojc%(I>-zc3?EadTcmzAw@yt3_7N`(-zl3nDoAaYTpTA|V5Fc7DJz#QB6yq6q{d9o zn!{SF!(dS|31aAkhkE9x!K7 zxer>wLKgF|&m-?j07BBrqfJ4MT+XZtxV42LGKQ;?kqTP4?wKfvVgUnWq=TRijA~qv zTI#ak&`43|I<9>uRl}s|73G~^oXx-v3Zil&@WxRZiXfG?PLj8jHjpIB2{db{rXaG6 zkdC;4*fw&SA3-`4X|~KxKsN;`Z`@R=cbrx7h|>4%uox7JQINR9)=(gf`aTwh=1W*% z3(Z|I^C`wg+nF55Kh`ObV`Rq~-pR8nXtqX2J7Vfjc&?Y%PEim&dtSI}*H7Z|tnUps zNX~K1$($1rLnP%hP)2|glmPM?HEY;TMa^<#J!yPW(Map|A+Z>M+dCw?15U=-DIVYg z=r|ZUam?SLh|1O!HufXI&NE;#87Mn)NhW6%snk|lC@cFXLE2D5oSqLc?(aH=3myT< zXcL!C`mZ2;+VPz#D}R7z;99SI#LZleTCN7D;mu@!>5_h(8*kVNR;~{MJ?Dq)3odh+ z)7*qG)Ukm|wW@j}w7IJhMivA;Nvc_`&8HBjo)L^vXVEDs$N;wlhfBO-ZdYrwz>3>r zhEvj;4@jZ{v44g6%18h$$8y&RLP6Q?Zitnu4cGjJyCc%DdNF_U{ZrL^e9fzosAZ3?r^fiG4fQe6cpvkQNjT#s7UH-qBi6{e5THkaSglL zN1rzI>MDf7Ke#x$`DJN|9Vm5Vavxue<>E}&NK2ou16>V*(`&V5Utx2ajouQG-AT53 zEewfPBy=V%@VXri&`r-bzQRT|27U!*K#C8FX*-m!Qq+;Y3?vDfei4p2meV)Ad3!qf zV)PA)_wCVVDF-J0@#n7Xe70=g5qmmUGM8yY3iict{DrG;pL&+73^{TJ8-RE{% z%)`^Ui1Z5e+T72UGV*D*>1M0`XzY={a!uc_my2Q9rtRlHvKvM zxKYcuu_=1@ujh}OuJ2a2_5FI$PM4dyf3J&H^Skv%SN)Ms4?HL;+|2H~<@5A(wx+`a2r%O?`ZNss6u@_ddRu++Lks(C_9~XTJkGD{bLo GApih71dCw+ From 78e17b1579d4f9282deccd905ad613b3f06abb31 Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Fri, 29 Apr 2016 08:21:51 +0200 Subject: [PATCH 17/76] Configure included zlib with autotools The included zlib should not be used on Linux or OS X, but (depending on local configuration) it might be needed for crosscompiling a mingw target from Linux. Now the user can choose whether to use the included zlib or not. cmake does already support that. zconf.h.in was taken from the original zlib 1.2.8 package. The generation of zconf.h was made equivalent to the one generated by cmake. --- 3rdparty/Makefile.am | 6 +- 3rdparty/zlib/1.2.8/zconf.h.in | 511 +++++++++++++++++++++++++++++++++ 3rdparty/zlib/Makefile.am | 1 + config/lyxinclude.m4 | 30 ++ configure.ac | 4 +- src/Makefile.am | 13 +- src/client/Makefile.am | 6 +- src/frontends/Makefile.am | 4 +- src/frontends/qt4/Makefile.am | 2 +- src/tex2lyx/Makefile.am | 4 +- 10 files changed, 563 insertions(+), 18 deletions(-) create mode 100644 3rdparty/zlib/1.2.8/zconf.h.in diff --git a/3rdparty/Makefile.am b/3rdparty/Makefile.am index 40eb64367a..54ab6c4e63 100644 --- a/3rdparty/Makefile.am +++ b/3rdparty/Makefile.am @@ -6,4 +6,8 @@ if USE_INCLUDED_BOOST BOOST = boost endif -SUBDIRS = $(BOOST) +if USE_INCLUDED_ZLIB +ZLIB = zlib +endif + +SUBDIRS = $(BOOST) $(ZLIB) diff --git a/3rdparty/zlib/1.2.8/zconf.h.in b/3rdparty/zlib/1.2.8/zconf.h.in new file mode 100644 index 0000000000..9987a77553 --- /dev/null +++ b/3rdparty/zlib/1.2.8/zconf.h.in @@ -0,0 +1,511 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2013 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". + */ +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +# define Z_PREFIX_SET + +/* all linked symbols */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_bits z__tr_flush_bits +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 +# ifndef Z_SOLO +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# endif +# define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 +# define deflate z_deflate +# define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy +# define deflateEnd z_deflateEnd +# define deflateInit2_ z_deflateInit2_ +# define deflateInit_ z_deflateInit_ +# define deflateParams z_deflateParams +# define deflatePending z_deflatePending +# define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateResetKeep z_deflateResetKeep +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright +# define get_crc_table z_get_crc_table +# ifndef Z_SOLO +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzgetc z_gzgetc +# define gzgetc_ z_gzgetc_ +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif +# define gzprintf z_gzprintf +# define gzvprintf z_gzvprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzwrite z_gzwrite +# endif +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetHeader z_inflateGetHeader +# define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 +# define inflateSetDictionary z_inflateSetDictionary +# define inflateGetDictionary z_inflateGetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateUndermine z_inflateUndermine +# define inflateResetKeep z_inflateResetKeep +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table +# ifndef Z_SOLO +# define uncompress z_uncompress +# endif +# define zError z_zError +# ifndef Z_SOLO +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# endif +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion + +/* all zlib typedefs in zlib.h and zconf.h */ +# define Byte z_Byte +# define Bytef z_Bytef +# define alloc_func z_alloc_func +# define charf z_charf +# define free_func z_free_func +# ifndef Z_SOLO +# define gzFile z_gzFile +# endif +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp +# define in_func z_in_func +# define intf z_intf +# define out_func z_out_func +# define uInt z_uInt +# define uIntf z_uIntf +# define uLong z_uLong +# define uLongf z_uLongf +# define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + +/* Some Mac compilers merge all .h files incorrectly: */ +#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) +# define NO_DUMMY_DECL +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# elif (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# elif (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +#endif + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + +#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + +#ifdef STDC +# ifndef Z_SOLO +# include /* for off_t */ +# endif +#endif + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +# include /* for va_list */ +# endif +#endif + +#ifdef _WIN32 +# ifndef Z_SOLO +# include /* for wchar_t */ +# endif +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) +# define Z_HAVE_UNISTD_H +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +# endif +#endif + +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif + +#ifndef z_off_t +# define z_off_t long +#endif + +#if !defined(_WIN32) && defined(Z_LARGE64) +# define z_off64_t off64_t +#else +# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/3rdparty/zlib/Makefile.am b/3rdparty/zlib/Makefile.am index 4fa7458520..ff20909f2c 100644 --- a/3rdparty/zlib/Makefile.am +++ b/3rdparty/zlib/Makefile.am @@ -9,6 +9,7 @@ EXTRA_DIST = \ CMakeLists.txt \ 1.2.8/README \ 1.2.8/treebuild.xml \ + 1.2.8/zconf.h.in \ 1.2.8/zconf.h.cmakein \ 1.2.8/zlib.3 \ 1.2.8/zlib.map \ diff --git a/config/lyxinclude.m4 b/config/lyxinclude.m4 index 8decd37ed9..45b40e325a 100644 --- a/config/lyxinclude.m4 +++ b/config/lyxinclude.m4 @@ -454,6 +454,36 @@ AC_DEFUN([LYX_USE_INCLUDED_BOOST],[ ]) +dnl Usage: LYX_USE_INCLUDED_ZLIB : select if the included zlib should +dnl be used. +AC_DEFUN([LYX_USE_INCLUDED_ZLIB],[ + AC_MSG_CHECKING([whether to use included zlib library]) + AC_ARG_WITH(included-zlib, + [AC_HELP_STRING([--without-included-zlib], [do not use the zlib lib supplied with LyX, try to find one in the system directories - compilation will abort if nothing suitable is found])], + [lyx_cv_with_included_zlib=$withval], + [lyx_cv_with_included_zlib=no]) + AM_CONDITIONAL(USE_INCLUDED_ZLIB, test x$lyx_cv_with_included_zlib = xyes) + AC_MSG_RESULT([$lyx_cv_with_included_zlib]) + if test x$lyx_cv_with_included_zlib = xyes ; then + ZLIB_INCLUDES='-I$(top_srcdir)/3rdparty/zlib/1.2.8' + ZLIB_LIBS='$(top_builddir)/3rdparty/zlib/liblyxzlib.a' + mkdir -p 3rdparty/zlib +dnl include standard config.h for HAVE_UNISTD_H + echo "#include <../../config.h>" > 3rdparty/zlib/zconf.h +dnl prevent clash with system zlib that might be dragged in by other libs + echo "#define Z_PREFIX 1" >> 3rdparty/zlib/zconf.h + cat "${srcdir}/3rdparty/zlib/1.2.8/zconf.h.in" >> 3rdparty/zlib/zconf.h + else + ZLIB_INCLUDES= + AC_CHECK_HEADERS(zlib.h, + [AC_CHECK_LIB(z, gzopen, [ZLIB_LIBS="-lz"], LYX_LIB_ERROR(libz,zlib))], + [LYX_LIB_ERROR(zlib.h,zlib)]) + fi + AC_SUBST(ZLIB_INCLUDES) + AC_SUBST(ZLIB_LIBS) +]) + + dnl Usage: LYX_CHECK_CALLSTACK_PRINTING: define LYX_CALLSTACK_PRINTING if the dnl necessary APIs are available to print callstacks. AC_DEFUN([LYX_CHECK_CALLSTACK_PRINTING], diff --git a/configure.ac b/configure.ac index bf3111a6c1..159b3f581e 100644 --- a/configure.ac +++ b/configure.ac @@ -138,9 +138,7 @@ else fi ### check for compression support -AC_CHECK_HEADERS(zlib.h, - [AC_CHECK_LIB(z, gzopen, [LIBS="$LIBS -lz"], LYX_LIB_ERROR(libz,zlib))], - [LYX_LIB_ERROR(zlib.h,zlib)]) +LYX_USE_INCLUDED_ZLIB ### check for file magic support (currently optional) AC_CHECK_HEADERS(magic.h, diff --git a/src/Makefile.am b/src/Makefile.am index bbd2746d33..c0e4d5844e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -2,7 +2,8 @@ include $(top_srcdir)/config/common.am ############################### Core ############################## -AM_CPPFLAGS += -I$(top_srcdir)/src $(BOOST_INCLUDES) $(ENCHANT_CFLAGS) $(HUNSPELL_CFLAGS) +AM_CPPFLAGS += -I$(top_srcdir)/src $(BOOST_INCLUDES) $(ZLIB_INCLUDES) +AM_CPPFLAGS += $(ENCHANT_CFLAGS) $(HUNSPELL_CFLAGS) AM_CPPFLAGS += $(QT_CPPFLAGS) $(QT_CORE_INCLUDES) if BUILD_CLIENT_SUBDIR @@ -19,7 +20,7 @@ EXTRA_DIST = lyx_commit_hash.h.in \ tests/CMakeLists.txt OTHERLIBS = $(BOOST_LIBS) $(MYTHES_LIBS) $(ENCHANT_LIBS) $(HUNSPELL_LIBS) \ - @LIBS@ $(SOCKET_LIBS) $(LIBSHLWAPI) $(LIBPSAPI) + @LIBS@ $(ZLIB_LIBS) $(SOCKET_LIBS) $(LIBSHLWAPI) $(LIBPSAPI) noinst_LIBRARIES = liblyxcore.a bin_PROGRAMS = lyx @@ -733,7 +734,7 @@ ADD_FRAMEWORKS = -framework QtGui -framework QtCore -framework AppKit -framework endif check_layout_CPPFLAGS = $(AM_CPPFLAGS) -check_layout_LDADD = support/liblyxsupport.a $(LIBICONV) $(BOOST_LIBS) @LIBS@ $(QT_LIB) $(LIBSHLWAPI) +check_layout_LDADD = support/liblyxsupport.a $(LIBICONV) $(BOOST_LIBS) @LIBS@ $(ZLIB_LIBS) $(QT_LIB) $(LIBSHLWAPI) check_layout_LDFLAGS = $(QT_LDFLAGS) $(ADD_FRAMEWORKS) check_layout_SOURCES = \ insets/InsetLayout.cpp \ @@ -753,7 +754,7 @@ check_layout_SOURCES = \ tests/dummy_functions.cpp check_ExternalTransforms_CPPFLAGS = $(AM_CPPFLAGS) -check_ExternalTransforms_LDADD = support/liblyxsupport.a $(LIBICONV) $(BOOST_LIBS) @LIBS@ $(QT_LIB) $(LIBSHLWAPI) +check_ExternalTransforms_LDADD = support/liblyxsupport.a $(LIBICONV) $(BOOST_LIBS) @LIBS@ $(ZLIB_LIBS) $(QT_LIB) $(LIBSHLWAPI) check_ExternalTransforms_LDFLAGS = $(QT_LDFLAGS) $(ADD_FRAMEWORKS) check_ExternalTransforms_SOURCES = \ graphics/GraphicsParams.cpp \ @@ -765,7 +766,7 @@ check_ExternalTransforms_SOURCES = \ tests/dummy_functions.cpp check_Length_CPPFLAGS = $(AM_CPPFLAGS) -check_Length_LDADD = support/liblyxsupport.a $(LIBICONV) $(BOOST_LIBS) @LIBS@ $(QT_LIB) $(LIBSHLWAPI) +check_Length_LDADD = support/liblyxsupport.a $(LIBICONV) $(BOOST_LIBS) @LIBS@ $(ZLIB_LIBS) $(QT_LIB) $(LIBSHLWAPI) check_Length_LDFLAGS = $(QT_LDFLAGS) $(ADD_FRAMEWORKS) check_Length_SOURCES = \ Length.cpp \ @@ -775,7 +776,7 @@ check_Length_SOURCES = \ tests/dummy_functions.cpp check_ListingsCaption_CPPFLAGS = $(AM_CPPFLAGS) -check_ListingsCaption_LDADD = support/liblyxsupport.a $(LIBICONV) $(BOOST_LIBS) @LIBS@ $(QT_LIB) $(LIBSHLWAPI) +check_ListingsCaption_LDADD = support/liblyxsupport.a $(LIBICONV) $(BOOST_LIBS) @LIBS@ $(ZLIB_LIBS) $(QT_LIB) $(LIBSHLWAPI) check_ListingsCaption_LDFLAGS = $(QT_LDFLAGS) $(ADD_FRAMEWORKS) check_ListingsCaption_SOURCES = \ tests/check_ListingsCaption.cpp \ diff --git a/src/client/Makefile.am b/src/client/Makefile.am index fac0e31bc1..131c56a6c3 100644 --- a/src/client/Makefile.am +++ b/src/client/Makefile.am @@ -8,11 +8,11 @@ bin_PROGRAMS = lyxclient EXTRA_DIST = lyxclient.1in CMakeLists.txt -AM_CPPFLAGS += -I$(srcdir)/.. $(BOOST_INCLUDES) +AM_CPPFLAGS += -I$(srcdir)/.. $(BOOST_INCLUDES) $(ZLIB_INCLUDES) lyxclient_LDADD = \ $(top_builddir)/src/support/liblyxsupport.a \ - $(BOOST_LIBS) @LIBS@ $(SOCKET_LIBS) \ + $(BOOST_LIBS) @LIBS@ $(ZLIB_LIBS) $(SOCKET_LIBS) \ $(QT_LIB) $(QT_LDFLAGS) $(LIBSHLWAPI) $(LIBPSAPI) if INSTALL_MACOSX @@ -39,7 +39,7 @@ lyxclient.cpp: if MONOLITHIC_CLIENT -AM_CPPFLAGS += -I$(srcdir)/.. $(BOOST_INCLUDES) +AM_CPPFLAGS += -I$(srcdir)/.. $(BOOST_INCLUDES) $(ZLIB_INCLUDES) BUILT_SOURCES = lyxclient.cpp CLEANFILES += lyxclient.cpp diff --git a/src/frontends/Makefile.am b/src/frontends/Makefile.am index aa74e57eca..0a615e1903 100644 --- a/src/frontends/Makefile.am +++ b/src/frontends/Makefile.am @@ -6,7 +6,7 @@ DIST_SUBDIRS = qt4 . noinst_LIBRARIES = liblyxfrontends.a -AM_CPPFLAGS += -I$(srcdir)/.. $(BOOST_INCLUDES) +AM_CPPFLAGS += -I$(srcdir)/.. $(BOOST_INCLUDES) $(ZLIB_INCLUDES) liblyxfrontends_a_SOURCES = \ alert.h \ @@ -39,7 +39,7 @@ TESTS = \ check_PROGRAMS = \ biblio -biblio_LDADD = $(BOOST_LIBS) +biblio_LDADD = $(BOOST_LIBS) $(ZLIB_LIBS) biblio_SOURCES = \ tests/biblio.cpp \ tests/boost.cpp diff --git a/src/frontends/qt4/Makefile.am b/src/frontends/qt4/Makefile.am index 2995a41729..3358186ccb 100644 --- a/src/frontends/qt4/Makefile.am +++ b/src/frontends/qt4/Makefile.am @@ -47,7 +47,7 @@ AM_CPPFLAGS += \ -I$(top_srcdir)/src \ -I$(top_srcdir)/src/frontends \ -I$(top_srcdir)/images \ - $(QT_INCLUDES) $(BOOST_INCLUDES) + $(QT_INCLUDES) $(BOOST_INCLUDES) $(ZLIB_INCLUDES) SOURCEFILES = \ ButtonPolicy.cpp \ diff --git a/src/tex2lyx/Makefile.am b/src/tex2lyx/Makefile.am index f0334822cd..e29356754f 100644 --- a/src/tex2lyx/Makefile.am +++ b/src/tex2lyx/Makefile.am @@ -19,7 +19,7 @@ DEFAULT_INCLUDES = AM_CPPFLAGS += -I$(top_srcdir)/src/tex2lyx \ -I$(top_srcdir)/src -I$(top_builddir) -I$(top_builddir)/src \ - $(BOOST_INCLUDES) + $(BOOST_INCLUDES) $(ZLIB_INCLUDES) TEST_FILES = \ test/runtests.cmake \ @@ -125,7 +125,7 @@ tex2lyx_LDADD = \ $(top_builddir)/src/support/liblyxsupport.a \ $(LIBICONV) $(BOOST_LIBS) \ $(QT_LIB) $(QT_LDFLAGS) \ - @LIBS@ $(LIBSHLWAPI) $(LIBPSAPI) + @LIBS@ $(ZLIB_LIBS) $(LIBSHLWAPI) $(LIBPSAPI) if INSTALL_MACOSX tex2lyx_LDFLAGS = -framework AppKit \ From 6343a017f75e65fee9fb2afd2812d016877961d8 Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Thu, 5 May 2016 12:41:24 +0200 Subject: [PATCH 18/76] Do not search for X in mingw builds The manual qt configuration did not work previously for mingw builds, since it serached for X libraries, which are not used by LyX on mingw. --- config/qt4.m4 | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/config/qt4.m4 b/config/qt4.m4 index 33029b933d..2bcd4f3bfc 100644 --- a/config/qt4.m4 +++ b/config/qt4.m4 @@ -253,8 +253,13 @@ AC_DEFUN([QT_DO_PKG_CONFIG], AC_DEFUN([QT_DO_MANUAL_CONFIG], [ dnl Check for X libraries - AC_PATH_X - AC_PATH_XTRA + case ${host} in + *mingw*) ;; + *) \ + AC_PATH_X \ + AC_PATH_XTRA \ + ;; + esac case $have_x in yes) LIBS="$X_PRE_LIBS $LIBS $X_LIBS -lX11 $X_EXTRA_LIBS" CPPFLAGS="$CPPFLAGS $X_CFLAGS";; From ee13c5b7e23f4ae9df4b586fe7c98e81f5161b0c Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Thu, 5 May 2016 12:46:59 +0200 Subject: [PATCH 19/76] Fix packaging for mingw-64 See bug 10053 for details. Without this, the package is only set correctly for 32bit mingw. Thanks Enrico for suggesting this fix and Shankar Giri Venkita Giri for testing it. --- config/lyxinclude.m4 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/lyxinclude.m4 b/config/lyxinclude.m4 index 45b40e325a..965c7ef920 100644 --- a/config/lyxinclude.m4 +++ b/config/lyxinclude.m4 @@ -630,7 +630,7 @@ AC_ARG_WITH(packaging, [lyx_use_packaging="$withval"], [ case $host in *-apple-darwin*) lyx_use_packaging=macosx ;; - *-pc-mingw32*) lyx_use_packaging=windows ;; + *-pc-mingw*) lyx_use_packaging=windows ;; *haiku*) lyx_use_packaging=haiku ;; *) lyx_use_packaging=posix ;; esac]) From 88b68ee004884e519d2d585fa18b424824f6b978 Mon Sep 17 00:00:00 2001 From: Shankar Giri Venkita Giri Date: Thu, 5 May 2016 12:54:53 +0200 Subject: [PATCH 20/76] Fix return types for mingw-w64 This is needed for warning-free compilation with mingw-w64, and does not hurt for other build configurations. Patch by Shankar Giri Venkita Giri (bug 10053). --- src/support/filetools.cpp | 2 +- src/support/os_win32.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/support/filetools.cpp b/src/support/filetools.cpp index 310e621e17..657343fb93 100644 --- a/src/support/filetools.cpp +++ b/src/support/filetools.cpp @@ -1065,7 +1065,7 @@ cmd_ret const runCommand(string const & cmd) 0, 0, &startup, &process)) { CloseHandle(process.hThread); - int fno = _open_osfhandle((long)in, _O_RDONLY); + int fno = _open_osfhandle(static_cast(in), _O_RDONLY); CloseHandle(out); inf = _fdopen(fno, "r"); } diff --git a/src/support/os_win32.cpp b/src/support/os_win32.cpp index 292555d6c7..a6e5da7c5a 100644 --- a/src/support/os_win32.cpp +++ b/src/support/os_win32.cpp @@ -569,7 +569,7 @@ bool autoOpenFile(string const & filename, auto_open_mode const mode, // reference: http://msdn.microsoft.com/en-us/library/bb762153.aspx char const * action = (mode == VIEW) ? "open" : "edit"; - bool success = reinterpret_cast(ShellExecute(NULL, action, + bool success = reinterpret_cast(ShellExecute(NULL, action, to_local8bit(from_utf8(filename)).c_str(), NULL, NULL, 1)) > 32; if (!path.empty() && !lyxrc.texinputs_prefix.empty()) { From e07a01a3c344dd5a0f5082e0ec81e97399894876 Mon Sep 17 00:00:00 2001 From: Shankar Giri Venkita Giri Date: Thu, 5 May 2016 12:58:01 +0200 Subject: [PATCH 21/76] Fix linking with autotools and mingw-64 ole32.lib is not linked automatically, but needed for mingw-64. Patch by Shankar Giri Venkita Giri (bug 10053). --- configure.ac | 1 + 1 file changed, 1 insertion(+) diff --git a/configure.ac b/configure.ac index 159b3f581e..3f6b89c376 100644 --- a/configure.ac +++ b/configure.ac @@ -116,6 +116,7 @@ AC_SUBST(LIBSHLWAPI) AC_CHECK_LIB(psapi, main, [LIBPSAPI=-lpsapi]) AC_SUBST(LIBPSAPI) AC_CHECK_LIB(gdi32, main) +AC_CHECK_LIB(ole32, main) LYX_USE_INCLUDED_BOOST LYX_USE_INCLUDED_MYTHES From d5f2bad461dc3fc783cbb1e1b205fa5c6543f8e7 Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Thu, 5 May 2016 13:05:12 +0200 Subject: [PATCH 22/76] Mingw-w64 build fixes for long long On mingw-w64, long long (64bit wide) is larger than long (32bit wide). Therefore we need some more specializations for string, docstring, otextstream and << overloaded ostream functions. The configuration code is by me, the source code changes by Shankar Giri Venkita Giri (bug 10053). --- configure.ac | 13 ++++++++++ development/cmake/ConfigureChecks.cmake | 7 ++++++ development/cmake/configCompiler.h.cmake | 7 ++++++ development/cmake/configCompiler.h.msvc | 6 +++++ src/support/convert.cpp | 32 ++++++++++++++++++++++++ src/support/convert.h | 8 ++++++ src/support/debug.cpp | 6 +++++ src/support/debug.h | 4 +++ src/support/docstring.cpp | 4 +-- src/support/lstrings.cpp | 11 ++++++++ src/support/lstrings.h | 3 +++ src/texstream.cpp | 8 ++++++ 12 files changed, 107 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 3f6b89c376..6de63c9fd7 100644 --- a/configure.ac +++ b/configure.ac @@ -130,6 +130,13 @@ LYX_CHECK_CALLSTACK_PRINTING # Needed for our char_type AC_CHECK_SIZEOF(wchar_t) +# Needed for Mingw-w64 +AC_TYPE_LONG_LONG_INT +if test "$ac_cv_type_long_long_int" = yes; then + AC_CHECK_SIZEOF(long) + AC_CHECK_SIZEOF(long long) +fi + ### We need iconv for unicode support (Qt4 frontend requires it too) AM_ICONV if test "$am_cv_func_iconv" = no; then @@ -324,6 +331,12 @@ char * strerror(int n); # define USE_WCHAR_T #endif +#ifdef HAVE_LONG_LONG_INT +#if SIZEOF_LONG_LONG > SIZEOF_LONG +#define LYX_USE_LONG_LONG +#endif +#endif + #endif ]) diff --git a/development/cmake/ConfigureChecks.cmake b/development/cmake/ConfigureChecks.cmake index 6dc82a7d87..825813b501 100644 --- a/development/cmake/ConfigureChecks.cmake +++ b/development/cmake/ConfigureChecks.cmake @@ -114,6 +114,13 @@ check_cxx_source_compiles( " SIZEOF_WCHAR_T_IS_4) +check_cxx_source_compiles( + " + int i[ ( sizeof(long long)>sizeof(long) ? 1 : -1 ) ]; + int main(){return 0;} + " +SIZEOF_LONG_LONG_GREATER_THAN_SIZEOF_LONG) + check_cxx_source_compiles( " #include diff --git a/development/cmake/configCompiler.h.cmake b/development/cmake/configCompiler.h.cmake index 858cfc9711..6eb627add7 100644 --- a/development/cmake/configCompiler.h.cmake +++ b/development/cmake/configCompiler.h.cmake @@ -42,6 +42,7 @@ #cmakedefine HAVE_MAGIC_H 1 #cmakedefine SIZEOF_WCHAR_T_IS_2 1 #cmakedefine SIZEOF_WCHAR_T_IS_4 1 +#cmakedefine SIZEOF_LONG_LONG_GREATER_THAN_SIZEOF_LONG 1 #ifdef SIZEOF_WCHAR_T_IS_2 # define SIZEOF_WCHAR_T 2 @@ -51,6 +52,12 @@ # endif #endif +#ifdef HAVE_LONG_LONG +#ifdef SIZEOF_LONG_LONG_GREATER_THAN_SIZEOF_LONG +#define LYX_USE_LONG_LONG +#endif +#endif + #cmakedefine GETTEXT_FOUND 1 #cmakedefine HAVE_ALLOCA 1 diff --git a/development/cmake/configCompiler.h.msvc b/development/cmake/configCompiler.h.msvc index 334015b5e9..5ff2e9dcf3 100644 --- a/development/cmake/configCompiler.h.msvc +++ b/development/cmake/configCompiler.h.msvc @@ -152,6 +152,12 @@ # define USE_WCHAR_T #endif +#ifdef HAVE_LONG_LONG +#ifdef SIZEOF_LONG_LONG_GREATER_THAN_SIZEOF_LONG +#define LYX_USE_LONG_LONG +#endif +#endif + #if defined(MAKE_INTL_LIB) && defined(_MSC_VER) #define __attribute__(x) #define inline diff --git a/src/support/convert.cpp b/src/support/convert.cpp index 6b985f50ba..58a56479a3 100644 --- a/src/support/convert.cpp +++ b/src/support/convert.cpp @@ -90,6 +90,22 @@ docstring convert(unsigned long ul) } +#ifdef LYX_USE_LONG_LONG +template<> +string convert(unsigned long long ull) +{ + return lexical_cast(ull); +} + + +template<> +docstring convert(unsigned long long ull) +{ + return from_ascii(lexical_cast(ull)); +} +#endif + + template<> string convert(long l) { @@ -104,6 +120,22 @@ docstring convert(long l) } +#ifdef LYX_USE_LONG_LONG +template<> +string convert(long long ll) +{ + return lexical_cast(ll); +} + + +template<> +docstring convert(long long ll) +{ + return from_ascii(lexical_cast(ll)); +} +#endif + + template<> string convert(float f) { diff --git a/src/support/convert.h b/src/support/convert.h index e72fe61b56..fb069c98c3 100644 --- a/src/support/convert.h +++ b/src/support/convert.h @@ -33,8 +33,16 @@ template<> std::string convert(unsigned int ui); template<> docstring convert(unsigned int ui); template<> std::string convert(unsigned long ul); template<> docstring convert(unsigned long ul); +#ifdef LYX_USE_LONG_LONG +template<> std::string convert(unsigned long long ull); +template<> docstring convert(unsigned long long ull); +#endif template<> std::string convert(long l); template<> docstring convert(long l); +#ifdef LYX_USE_LONG_LONG +template<> std::string convert(long long ll); +template<> docstring convert(long long ll); +#endif template<> std::string convert(float f); template<> std::string convert(double d); template<> int convert(std::string const & s); diff --git a/src/support/debug.cpp b/src/support/debug.cpp index 538b487760..bff9bf415a 100644 --- a/src/support/debug.cpp +++ b/src/support/debug.cpp @@ -243,6 +243,12 @@ LyXErr & operator<<(LyXErr & l, long t) { return toStream(l, t); } LyXErr & operator<<(LyXErr & l, unsigned long t) { return toStream(l, t); } +#ifdef LYX_USE_LONG_LONG +LyXErr & operator<<(LyXErr & l, long long t) +{ return toStream(l, t); } +LyXErr & operator<<(LyXErr & l, unsigned long long t) +{ return toStream(l, t); } +#endif LyXErr & operator<<(LyXErr & l, double t) { return toStream(l, t); } LyXErr & operator<<(LyXErr & l, string const & t) diff --git a/src/support/debug.h b/src/support/debug.h index 216538958d..b98dfd0eab 100644 --- a/src/support/debug.h +++ b/src/support/debug.h @@ -202,6 +202,10 @@ LyXErr & operator<<(LyXErr &, int); LyXErr & operator<<(LyXErr &, unsigned int); LyXErr & operator<<(LyXErr &, long); LyXErr & operator<<(LyXErr &, unsigned long); +#ifdef LYX_USE_LONG_LONG +LyXErr & operator<<(LyXErr &, long long); +LyXErr & operator<<(LyXErr &, unsigned long long); +#endif LyXErr & operator<<(LyXErr &, double); LyXErr & operator<<(LyXErr &, std::string const &); LyXErr & operator<<(LyXErr &, docstring const &); diff --git a/src/support/docstring.cpp b/src/support/docstring.cpp index f44259d349..95c86b3665 100644 --- a/src/support/docstring.cpp +++ b/src/support/docstring.cpp @@ -514,7 +514,7 @@ protected: return do_put_helper(oit, b, fill, v); } -#ifdef _GLIBCXX_USE_LONG_LONG +#ifdef LYX_USE_LONG_LONG iter_type do_put(iter_type oit, ios_base & b, char_type fill, long long v) const { @@ -675,7 +675,7 @@ protected: return do_get_integer(iit, eit, b, err, v); } -#ifdef _GLIBCXX_USE_LONG_LONG +#ifdef LYX_USE_LONG_LONG iter_type do_get(iter_type iit, iter_type eit, ios_base & b, ios_base::iostate & err, long long & v) const diff --git a/src/support/lstrings.cpp b/src/support/lstrings.cpp index f4aba23c0a..6d5f86672f 100644 --- a/src/support/lstrings.cpp +++ b/src/support/lstrings.cpp @@ -1437,6 +1437,17 @@ docstring bformat(docstring const & fmt, long arg1) } +#ifdef LYX_USE_LONG_LONG +template<> +docstring bformat(docstring const & fmt, long long arg1) +{ + LATTEST(contains(fmt, from_ascii("%1$d"))); + docstring const str = subst(fmt, from_ascii("%1$d"), convert(arg1)); + return subst(str, from_ascii("%%"), from_ascii("%")); +} +#endif + + template<> docstring bformat(docstring const & fmt, unsigned int arg1) { diff --git a/src/support/lstrings.h b/src/support/lstrings.h index 269b5a6564..ac310c59c4 100644 --- a/src/support/lstrings.h +++ b/src/support/lstrings.h @@ -357,6 +357,9 @@ docstring bformat(docstring const & fmt, Arg1, Arg2, Arg3, Arg4); template<> docstring bformat(docstring const & fmt, int arg1); template<> docstring bformat(docstring const & fmt, long arg1); +#ifdef LYX_USE_LONG_LONG +template<> docstring bformat(docstring const & fmt, long long arg1); +#endif template<> docstring bformat(docstring const & fmt, unsigned int arg1); template<> docstring bformat(docstring const & fmt, docstring arg1); template<> docstring bformat(docstring const & fmt, char * arg1); diff --git a/src/texstream.cpp b/src/texstream.cpp index 3268dca7b2..16f8dfbe68 100644 --- a/src/texstream.cpp +++ b/src/texstream.cpp @@ -215,6 +215,11 @@ template otexrowstream & operator<< (otexrowstream &, template otexrowstream & operator<< (otexrowstream &, unsigned long); +#ifdef LYX_USE_LONG_LONG +template otexrowstream & operator<< (otexrowstream &, + unsigned long long); +#endif + template otexstream & operator<<(otexstream & ots, Type value) @@ -230,5 +235,8 @@ template otexstream & operator<< (otexstream &, double); template otexstream & operator<< (otexstream &, int); template otexstream & operator<< (otexstream &, unsigned int); template otexstream & operator<< (otexstream &, unsigned long); +#ifdef LYX_USE_LONG_LONG +template otexstream & operator<< (otexstream &, unsigned long long); +#endif } From a5cd574f55969352255daa8925825aadfb391eda Mon Sep 17 00:00:00 2001 From: Shankar Giri Venkita Giri Date: Thu, 5 May 2016 13:36:51 +0200 Subject: [PATCH 23/76] Document MinGW64 autotools build Update INSTALL.Win32 to describe compiling with GCC with MinGW64 + MSYS2 Environment using autotools (see bug 10053) --- INSTALL.Win32 | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/INSTALL.Win32 b/INSTALL.Win32 index 3b71427200..abd3601d50 100644 --- a/INSTALL.Win32 +++ b/INSTALL.Win32 @@ -107,3 +107,17 @@ Creating the Installer - Copy the 3 dll-files from there to the DLL folder of the NSIS installation - Check whether the file locations/paths in settings.nsh match your setup. - Right-click on lyx.nsi and click "Compile NSIS Script". + + +Compiling with GCC with MinGW64 + MSYS2 Environment using autotools +=================================================================== +1 Install MSYS2, MINGW64, Qt5+ + https://wiki.qt.io/MSYS2 +2 Install bc (Bench calculater), which autotools uses for some reason to compile LyX + pacman -S bc +3 Run the standard autotools install (Adapt paths and arguments accordingly) + ./autogen.sh + ./configure --without-x --enable-qt5 --disable-debug --enable-optimization --prefix=/mingw64 + make + make install + From 306eb8d2a717bcc0376652e0eed60dc0dac01545 Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Thu, 5 May 2016 13:38:25 +0200 Subject: [PATCH 24/76] Add Shankar Giri Venkita Giri to CREDITS --- lib/CREDITS | 3 +++ lib/generate_contributions.py | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/lib/CREDITS b/lib/CREDITS index 3967ef5100..bcc9f4c6ad 100644 --- a/lib/CREDITS +++ b/lib/CREDITS @@ -169,6 +169,9 @@ @bStefano Ghirlanda @iE-mail: stefano.ghirlanda () unibo ! it Improvements to lyxserver +@bShankar Giri Venkita Giri +@iE-mail: girivs () gmx ! com + Mingw-w64 build fixes @bHartmut Goebel @iE-mail: h.goebel () crazy-compilers ! com Improvements to Koma-Script classes diff --git a/lib/generate_contributions.py b/lib/generate_contributions.py index a2e6906583..822e023c1c 100755 --- a/lib/generate_contributions.py +++ b/lib/generate_contributions.py @@ -771,6 +771,14 @@ contributors = [ "28 February 2005", u"Improvements to lyxserver"), + contributor(u"Shankar Giri Venkita Giri", + "girivs () gmx ! com", + "GPL", + "Blanket permission", + "m=146162343015182", + "25 April 2016", + u"Mingw-w64 build fixes"), + contributor(u"Hartmut Goebel", "h.goebel () crazy-compilers ! com", "GPL", From 127e5b1955af5edc9000c8c8c9fb40494a5f2096 Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Thu, 5 May 2016 17:36:41 +0200 Subject: [PATCH 25/76] Add forgotten zlib includes I forgot this in 9b822b25ae5. Also remove a comment that is no longer true. --- 3rdparty/zlib/Makefile.am | 3 --- src/support/Makefile.am | 3 ++- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/3rdparty/zlib/Makefile.am b/3rdparty/zlib/Makefile.am index ff20909f2c..c80e963a1d 100644 --- a/3rdparty/zlib/Makefile.am +++ b/3rdparty/zlib/Makefile.am @@ -1,8 +1,5 @@ include $(top_srcdir)/config/common.am -# This is prepared for compilation, but currently only used for packaging, -# because configure support for compilation is still missing. - noinst_LIBRARIES = liblyxzlib.a EXTRA_DIST = \ diff --git a/src/support/Makefile.am b/src/support/Makefile.am index ed6af579d1..d1137290ee 100644 --- a/src/support/Makefile.am +++ b/src/support/Makefile.am @@ -26,7 +26,8 @@ liblyxsupport_a_DEPENDENCIES = $(MOCEDFILES) # ################################################################## -AM_CPPFLAGS += -I$(srcdir)/.. $(BOOST_INCLUDES) $(QT_CPPFLAGS) $(QT_INCLUDES) +AM_CPPFLAGS += -I$(srcdir)/.. $(BOOST_INCLUDES) $(ZLIB_INCLUDES) \ + $(QT_CPPFLAGS) $(QT_INCLUDES) liblyxsupport_a_SOURCES = \ FileMonitor.h \ From 637fbb7ac9f43aac5bcfc09adca0e5ca0631a14b Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Thu, 5 May 2016 19:28:11 +0200 Subject: [PATCH 26/76] Use c-style cast as in original static_cast does not work --- src/support/filetools.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/support/filetools.cpp b/src/support/filetools.cpp index 657343fb93..a72c93ed61 100644 --- a/src/support/filetools.cpp +++ b/src/support/filetools.cpp @@ -1065,7 +1065,7 @@ cmd_ret const runCommand(string const & cmd) 0, 0, &startup, &process)) { CloseHandle(process.hThread); - int fno = _open_osfhandle(static_cast(in), _O_RDONLY); + int fno = _open_osfhandle((intptr_t)in, _O_RDONLY); CloseHandle(out); inf = _fdopen(fno, "r"); } From 041bcbed7407e4d7b89253a3d061bc5b8bb27613 Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Thu, 5 May 2016 19:41:16 +0200 Subject: [PATCH 27/76] Fix include path for zconf.h I forgot that in the previous commit, and compilation seemed to work because I had another zconf.h lying around. --- config/lyxinclude.m4 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/lyxinclude.m4 b/config/lyxinclude.m4 index 965c7ef920..df17da8843 100644 --- a/config/lyxinclude.m4 +++ b/config/lyxinclude.m4 @@ -465,7 +465,7 @@ AC_DEFUN([LYX_USE_INCLUDED_ZLIB],[ AM_CONDITIONAL(USE_INCLUDED_ZLIB, test x$lyx_cv_with_included_zlib = xyes) AC_MSG_RESULT([$lyx_cv_with_included_zlib]) if test x$lyx_cv_with_included_zlib = xyes ; then - ZLIB_INCLUDES='-I$(top_srcdir)/3rdparty/zlib/1.2.8' + ZLIB_INCLUDES='-I$(top_srcdir)/3rdparty/zlib/1.2.8 -I$(top_builddir)/3rdparty/zlib' ZLIB_LIBS='$(top_builddir)/3rdparty/zlib/liblyxzlib.a' mkdir -p 3rdparty/zlib dnl include standard config.h for HAVE_UNISTD_H From 08afc52c4cc5fe8740722d7715fd66baa3dd9ffa Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Thu, 5 May 2016 19:43:24 +0200 Subject: [PATCH 28/76] Configure included iconv with autotools The included iconv should not be used on Linux or OS X, but (depending on local configuration) it might be needed for crosscompiling a mingw target from Linux. Now the user can choose whether to use the included iconv or not. cmake does already support that. eilseq.m4 was taken from the original libiconv 1.14 package. --- 3rdparty/Makefile.am | 6 +++- 3rdparty/libiconv/Makefile.am | 20 +++++------ config/lyxinclude.m4 | 64 +++++++++++++++++++++++++++++++++ configure.ac | 29 +++++++-------- m4/Makefile.am | 3 +- m4/eilseq.m4 | 67 +++++++++++++++++++++++++++++++++++ src/Makefile.am | 18 ++++++---- src/client/Makefile.am | 5 +-- src/frontends/Makefile.am | 5 +-- src/frontends/qt4/Makefile.am | 3 +- src/support/Makefile.am | 3 +- src/tex2lyx/Makefile.am | 4 +-- 12 files changed, 187 insertions(+), 40 deletions(-) create mode 100644 m4/eilseq.m4 diff --git a/3rdparty/Makefile.am b/3rdparty/Makefile.am index 54ab6c4e63..f936a4c753 100644 --- a/3rdparty/Makefile.am +++ b/3rdparty/Makefile.am @@ -6,8 +6,12 @@ if USE_INCLUDED_BOOST BOOST = boost endif +if USE_INCLUDED_ICONV +ICONV = libiconv +endif + if USE_INCLUDED_ZLIB ZLIB = zlib endif -SUBDIRS = $(BOOST) $(ZLIB) +SUBDIRS = $(BOOST) $(ICONV) $(ZLIB) diff --git a/3rdparty/libiconv/Makefile.am b/3rdparty/libiconv/Makefile.am index d965f380f1..d03032d131 100644 --- a/3rdparty/libiconv/Makefile.am +++ b/3rdparty/libiconv/Makefile.am @@ -1,10 +1,7 @@ include $(top_srcdir)/config/common.am -# This is prepared for compilation, but currently only used for packaging, -# because configure support for compilation is still missing. - # We do not build right now -#noinst_LIBRARIES = liblyxiconv.a +noinst_LIBRARIES = liblyxiconv.a EXTRA_DIST = \ CMakeLists.txt \ @@ -33,11 +30,15 @@ EXTRA_DIST = \ 1.14/libcharset/lib/ref-add.sin \ 1.14/libcharset/lib/ref-del.sin -# If/when we decide to build, this will do in liblyxiconv_a_SOURCES -# But for now it confuses automake < 1.14, where we do not use subdir-objects. -# The issue here is that there are two relocatable.c files, and they would -# create the same .o file. -EXTRA_DIST += \ +AM_CPPFLAGS += -I$(srcdir)/1.14/srclib -DLIBDIR="" + +# The two relocatable.c files confuse automake < 1.14, where we do not use +# subdir-objects. Therefore we cannot put both in liblyxiconv_a_SOURCES +# (they would both create the same .o file). Fortunately their contents is +# identical, so it is enough to build only one. +EXTRA_DIST += 1.14/libcharset/lib/relocatable.c + +liblyxiconv_a_SOURCES = \ 1.14/include/export.h \ 1.14/lib/aliases2.h \ 1.14/lib/aliases_aix.h \ @@ -263,7 +264,6 @@ EXTRA_DIST += \ 1.14/lib/viscii.h \ 1.14/libcharset/include/export.h \ 1.14/libcharset/lib/localcharset.c \ - 1.14/libcharset/lib/relocatable.c \ 1.14/libcharset/lib/relocatable.h \ 1.14/srclib/localcharset.h \ 1.14/srclib/unitypes.in.h \ diff --git a/config/lyxinclude.m4 b/config/lyxinclude.m4 index df17da8843..84f66880a2 100644 --- a/config/lyxinclude.m4 +++ b/config/lyxinclude.m4 @@ -454,6 +454,70 @@ AC_DEFUN([LYX_USE_INCLUDED_BOOST],[ ]) +dnl Usage: LYX_USE_INCLUDED_ICONV : select if the included iconv should +dnl be used. +AC_DEFUN([LYX_USE_INCLUDED_ICONV],[ + AC_MSG_CHECKING([whether to use included iconv library]) + AC_ARG_WITH(included-iconv, + [AC_HELP_STRING([--without-included-iconv], [do not use the iconv lib supplied with LyX, try to find one in the system directories - compilation will abort if nothing suitable is found])], + [lyx_cv_with_included_iconv=$withval], + [lyx_cv_with_included_iconv=no]) + AM_CONDITIONAL(USE_INCLUDED_ICONV, test x$lyx_cv_with_included_iconv = xyes) + AC_MSG_RESULT([$lyx_cv_with_included_iconv]) + if test x$lyx_cv_with_included_iconv = xyes ; then +dnl Some bits from libiconv configure.ac to avoid a nested configure call: + AC_EILSEQ + AC_TYPE_MBSTATE_T + AC_CHECK_FUNCS([getc_unlocked mbrtowc wcrtomb mbsinit setlocale]) +dnl Ymbstate_t is used if HAVE_WCRTOMB || HAVE_MBRTOWC, see 3rdparty/libiconv/1.14/lib/loop_wchar.h. + if test $ac_cv_func_wcrtomb = yes || test $ac_cv_func_mbrtowc = yes; then + USE_MBSTATE_T=1 + else + USE_MBSTATE_T=0 + fi + AC_SUBST([USE_MBSTATE_T]) + AC_CACHE_CHECK([whether is standalone], + [gl_cv_header_wchar_h_standalone], + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[#include + wchar_t w;]], + [[]])], + [gl_cv_header_wchar_h_standalone=yes], + [gl_cv_header_wchar_h_standalone=no])]) + if test $gl_cv_header_wchar_h_standalone = yes; then + BROKEN_WCHAR_H=0 + else + BROKEN_WCHAR_H=1 + fi + AC_SUBST([BROKEN_WCHAR_H]) +dnl we want const correctness + AC_DEFINE_UNQUOTED([ICONV_CONST], [const], + [Define as const if the declaration of iconv() needs const.]) + ICONV_CONST=const + AC_SUBST([ICONV_CONST]) +dnl we build a static lib + DLL_VARIABLE= + AC_SUBST([DLL_VARIABLE]) + ICONV_INCLUDES='-I$(top_srcdir)/3rdparty/libiconv/1.14 -I$(top_builddir)/3rdparty/libiconv' + ICONV_LIBS='\$(top_builddir)/3rdparty/libiconv/liblyxiconv.a' + ICONV_ICONV_H_IN=3rdparty/libiconv/iconv.h:3rdparty/libiconv/1.14/include/iconv.h.in + else + ICONV_INCLUDES= + AM_ICONV + if test "$am_cv_func_iconv" = no; then + AC_MSG_ERROR([cannot find required library iconv.]) + else + ICONV_LIBS="$LIBICONV" + fi + ICONV_ICONV_H_IN= + fi + AC_SUBST(ICONV_INCLUDES) + AC_SUBST(ICONV_LIBS) + AC_SUBST(ICONV_ICONV_H_IN) +]) + + dnl Usage: LYX_USE_INCLUDED_ZLIB : select if the included zlib should dnl be used. AC_DEFUN([LYX_USE_INCLUDED_ZLIB],[ diff --git a/configure.ac b/configure.ac index 6de63c9fd7..3b1a900ddb 100644 --- a/configure.ac +++ b/configure.ac @@ -130,6 +130,19 @@ LYX_CHECK_CALLSTACK_PRINTING # Needed for our char_type AC_CHECK_SIZEOF(wchar_t) +# Taken from gettext, needed for libiconv +AC_CACHE_CHECK([for wchar_t], [gt_cv_c_wchar_t], + [AC_TRY_COMPILE([#include + wchar_t foo = (wchar_t)'\0';], , + [gt_cv_c_wchar_t=yes], [gt_cv_c_wchar_t=no])]) +if test $gt_cv_c_wchar_t = yes; then + AC_DEFINE([HAVE_WCHAR_T], [1], [Define if you have the 'wchar_t' type.]) + HAVE_WCHAR_T=1 +else + HAVE_WCHAR_T=0 +fi +AC_SUBST([HAVE_WCHAR_T]) + # Needed for Mingw-w64 AC_TYPE_LONG_LONG_INT if test "$ac_cv_type_long_long_int" = yes; then @@ -138,12 +151,7 @@ if test "$ac_cv_type_long_long_int" = yes; then fi ### We need iconv for unicode support (Qt4 frontend requires it too) -AM_ICONV -if test "$am_cv_func_iconv" = no; then - AC_MSG_ERROR([cannot find required library iconv.]) -else - LIBS="$LIBS $LIBICONV" -fi +LYX_USE_INCLUDED_ICONV ### check for compression support LYX_USE_INCLUDED_ZLIB @@ -197,14 +205,6 @@ AC_TYPE_OFF_T AC_TYPE_PID_T AC_TYPE_SIZE_T AC_TYPE_UID_T -# Taken from gettext -AC_CACHE_CHECK([for wchar_t], [gt_cv_c_wchar_t], - [AC_TRY_COMPILE([#include - wchar_t foo = (wchar_t)'\0';], , - [gt_cv_c_wchar_t=yes], [gt_cv_c_wchar_t=no])]) -if test $gt_cv_c_wchar_t = yes; then - AC_DEFINE([HAVE_WCHAR_T], [1], [Define if you have the 'wchar_t' type.]) -fi LYX_CHECK_DEF(PATH_MAX, limits.h, [int n = PATH_MAX;]) @@ -368,6 +368,7 @@ AC_CONFIG_FILES([Makefile \ 3rdparty/boost/Makefile \ 3rdparty/hunspell/Makefile \ 3rdparty/libiconv/Makefile \ + $ICONV_ICONV_H_IN \ 3rdparty/zlib/Makefile \ autotests/Makefile \ config/Makefile \ diff --git a/m4/Makefile.am b/m4/Makefile.am index 2fd4fbb176..6f02330e4c 100644 --- a/m4/Makefile.am +++ b/m4/Makefile.am @@ -1 +1,2 @@ -EXTRA_DIST = iconv.m4 lib-ld.m4 lib-link.m4 lib-prefix.m4 nls.m4 po.m4 progtest.m4 +EXTRA_DIST = eilseq.m4 iconv.m4 lib-ld.m4 lib-link.m4 lib-prefix.m4 nls.m4 \ + po.m4 progtest.m4 diff --git a/m4/eilseq.m4 b/m4/eilseq.m4 new file mode 100644 index 0000000000..792d514b59 --- /dev/null +++ b/m4/eilseq.m4 @@ -0,0 +1,67 @@ +#serial 1 + +AC_PREREQ(2.50) + +# The EILSEQ errno value ought to be defined in , according to +# ISO C 99 and POSIX. But some systems (like SunOS 4) don't define it, +# and some systems (like BSD/OS) define it in not . + +# Define EILSEQ as a C macro and as a substituted macro in such a way that +# 1. on all systems, after inclusion of , EILSEQ is usable, +# 2. on systems where EILSEQ is defined elsewhere, we use the same numeric +# value. + +AC_DEFUN([AC_EILSEQ], +[ + AC_REQUIRE([AC_PROG_CC])dnl + + dnl Check for any extra headers that could define EILSEQ. + AC_CHECK_HEADERS(wchar.h) + + AC_CACHE_CHECK([for EILSEQ], ac_cv_decl_EILSEQ, [ + AC_EGREP_CPP(yes,[ +#include +#ifdef EILSEQ +yes +#endif + ], have_eilseq=1) + if test -n "$have_eilseq"; then + dnl EILSEQ exists in . Don't need to define EILSEQ ourselves. + ac_cv_decl_EILSEQ=yes + else + AC_EGREP_CPP(yes,[ +#include +#if HAVE_WCHAR_H +#include +#endif +#ifdef EILSEQ +yes +#endif + ], have_eilseq=1) + if test -n "$have_eilseq"; then + dnl EILSEQ exists in some other system header. + dnl Define it to the same value. + _AC_COMPUTE_INT([EILSEQ], ac_cv_decl_EILSEQ, [ +#include +#if HAVE_WCHAR_H +#include +#endif +/* The following two lines are a workaround against an autoconf-2.52 bug. */ +#include +#include +]) + else + dnl EILSEQ isn't defined by the system. Define EILSEQ ourselves, but + dnl don't define it as EINVAL, because iconv() callers want to + dnl distinguish EINVAL and EILSEQ. + ac_cv_decl_EILSEQ=ENOENT + fi + fi + ]) + if test "$ac_cv_decl_EILSEQ" != yes; then + AC_DEFINE_UNQUOTED([EILSEQ], [$ac_cv_decl_EILSEQ], + [Define as good substitute value for EILSEQ.]) + EILSEQ="$ac_cv_decl_EILSEQ" + AC_SUBST(EILSEQ) + fi +]) diff --git a/src/Makefile.am b/src/Makefile.am index c0e4d5844e..8166b11ff4 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -2,7 +2,8 @@ include $(top_srcdir)/config/common.am ############################### Core ############################## -AM_CPPFLAGS += -I$(top_srcdir)/src $(BOOST_INCLUDES) $(ZLIB_INCLUDES) +AM_CPPFLAGS += -I$(top_srcdir)/src +AM_CPPFLAGS += $(BOOST_INCLUDES) $(ICONV_INCLUDES) $(ZLIB_INCLUDES) AM_CPPFLAGS += $(ENCHANT_CFLAGS) $(HUNSPELL_CFLAGS) AM_CPPFLAGS += $(QT_CPPFLAGS) $(QT_CORE_INCLUDES) @@ -20,7 +21,8 @@ EXTRA_DIST = lyx_commit_hash.h.in \ tests/CMakeLists.txt OTHERLIBS = $(BOOST_LIBS) $(MYTHES_LIBS) $(ENCHANT_LIBS) $(HUNSPELL_LIBS) \ - @LIBS@ $(ZLIB_LIBS) $(SOCKET_LIBS) $(LIBSHLWAPI) $(LIBPSAPI) + @LIBS@ $(ICONV_LIBS) $(ZLIB_LIBS) $(SOCKET_LIBS) \ + $(LIBSHLWAPI) $(LIBPSAPI) noinst_LIBRARIES = liblyxcore.a bin_PROGRAMS = lyx @@ -734,7 +736,8 @@ ADD_FRAMEWORKS = -framework QtGui -framework QtCore -framework AppKit -framework endif check_layout_CPPFLAGS = $(AM_CPPFLAGS) -check_layout_LDADD = support/liblyxsupport.a $(LIBICONV) $(BOOST_LIBS) @LIBS@ $(ZLIB_LIBS) $(QT_LIB) $(LIBSHLWAPI) +check_layout_LDADD = support/liblyxsupport.a $(LIBICONV) $(BOOST_LIBS) @LIBS@ \ + $(ICONV_LIBS) $(ZLIB_LIBS) $(QT_LIB) $(LIBSHLWAPI) check_layout_LDFLAGS = $(QT_LDFLAGS) $(ADD_FRAMEWORKS) check_layout_SOURCES = \ insets/InsetLayout.cpp \ @@ -754,7 +757,8 @@ check_layout_SOURCES = \ tests/dummy_functions.cpp check_ExternalTransforms_CPPFLAGS = $(AM_CPPFLAGS) -check_ExternalTransforms_LDADD = support/liblyxsupport.a $(LIBICONV) $(BOOST_LIBS) @LIBS@ $(ZLIB_LIBS) $(QT_LIB) $(LIBSHLWAPI) +check_ExternalTransforms_LDADD = support/liblyxsupport.a $(LIBICONV) $(BOOST_LIBS) @LIBS@ \ + $(ICONV_LIBS) $(ZLIB_LIBS) $(QT_LIB) $(LIBSHLWAPI) check_ExternalTransforms_LDFLAGS = $(QT_LDFLAGS) $(ADD_FRAMEWORKS) check_ExternalTransforms_SOURCES = \ graphics/GraphicsParams.cpp \ @@ -766,7 +770,8 @@ check_ExternalTransforms_SOURCES = \ tests/dummy_functions.cpp check_Length_CPPFLAGS = $(AM_CPPFLAGS) -check_Length_LDADD = support/liblyxsupport.a $(LIBICONV) $(BOOST_LIBS) @LIBS@ $(ZLIB_LIBS) $(QT_LIB) $(LIBSHLWAPI) +check_Length_LDADD = support/liblyxsupport.a $(LIBICONV) $(BOOST_LIBS) @LIBS@ \ + $(ICONV_LIBS) $(ZLIB_LIBS) $(QT_LIB) $(LIBSHLWAPI) check_Length_LDFLAGS = $(QT_LDFLAGS) $(ADD_FRAMEWORKS) check_Length_SOURCES = \ Length.cpp \ @@ -776,7 +781,8 @@ check_Length_SOURCES = \ tests/dummy_functions.cpp check_ListingsCaption_CPPFLAGS = $(AM_CPPFLAGS) -check_ListingsCaption_LDADD = support/liblyxsupport.a $(LIBICONV) $(BOOST_LIBS) @LIBS@ $(ZLIB_LIBS) $(QT_LIB) $(LIBSHLWAPI) +check_ListingsCaption_LDADD = support/liblyxsupport.a $(LIBICONV) $(BOOST_LIBS) @LIBS@ \ + $(ICONV_LIBS) $(ZLIB_LIBS) $(QT_LIB) $(LIBSHLWAPI) check_ListingsCaption_LDFLAGS = $(QT_LDFLAGS) $(ADD_FRAMEWORKS) check_ListingsCaption_SOURCES = \ tests/check_ListingsCaption.cpp \ diff --git a/src/client/Makefile.am b/src/client/Makefile.am index 131c56a6c3..3874376ab4 100644 --- a/src/client/Makefile.am +++ b/src/client/Makefile.am @@ -8,11 +8,12 @@ bin_PROGRAMS = lyxclient EXTRA_DIST = lyxclient.1in CMakeLists.txt -AM_CPPFLAGS += -I$(srcdir)/.. $(BOOST_INCLUDES) $(ZLIB_INCLUDES) +AM_CPPFLAGS += -I$(srcdir)/.. \ + $(BOOST_INCLUDES) $(ICONV_INCLUDES) $(ZLIB_INCLUDES) lyxclient_LDADD = \ $(top_builddir)/src/support/liblyxsupport.a \ - $(BOOST_LIBS) @LIBS@ $(ZLIB_LIBS) $(SOCKET_LIBS) \ + $(BOOST_LIBS) @LIBS@ $(ICONV_LIBS) $(ZLIB_LIBS) $(SOCKET_LIBS) \ $(QT_LIB) $(QT_LDFLAGS) $(LIBSHLWAPI) $(LIBPSAPI) if INSTALL_MACOSX diff --git a/src/frontends/Makefile.am b/src/frontends/Makefile.am index 0a615e1903..862613a67f 100644 --- a/src/frontends/Makefile.am +++ b/src/frontends/Makefile.am @@ -6,7 +6,8 @@ DIST_SUBDIRS = qt4 . noinst_LIBRARIES = liblyxfrontends.a -AM_CPPFLAGS += -I$(srcdir)/.. $(BOOST_INCLUDES) $(ZLIB_INCLUDES) +AM_CPPFLAGS += -I$(srcdir)/.. \ + $(BOOST_INCLUDES) $(ICONV_INCLUDES) $(ZLIB_INCLUDES) liblyxfrontends_a_SOURCES = \ alert.h \ @@ -39,7 +40,7 @@ TESTS = \ check_PROGRAMS = \ biblio -biblio_LDADD = $(BOOST_LIBS) $(ZLIB_LIBS) +biblio_LDADD = $(BOOST_LIBS) $(ICONV_LIBS) $(ZLIB_LIBS) biblio_SOURCES = \ tests/biblio.cpp \ tests/boost.cpp diff --git a/src/frontends/qt4/Makefile.am b/src/frontends/qt4/Makefile.am index 3358186ccb..fb21eb692e 100644 --- a/src/frontends/qt4/Makefile.am +++ b/src/frontends/qt4/Makefile.am @@ -47,7 +47,8 @@ AM_CPPFLAGS += \ -I$(top_srcdir)/src \ -I$(top_srcdir)/src/frontends \ -I$(top_srcdir)/images \ - $(QT_INCLUDES) $(BOOST_INCLUDES) $(ZLIB_INCLUDES) + $(QT_INCLUDES) \ + $(BOOST_INCLUDES) $(ICONV_INCLUDES) $(ZLIB_INCLUDES) SOURCEFILES = \ ButtonPolicy.cpp \ diff --git a/src/support/Makefile.am b/src/support/Makefile.am index d1137290ee..29f003b85d 100644 --- a/src/support/Makefile.am +++ b/src/support/Makefile.am @@ -26,7 +26,8 @@ liblyxsupport_a_DEPENDENCIES = $(MOCEDFILES) # ################################################################## -AM_CPPFLAGS += -I$(srcdir)/.. $(BOOST_INCLUDES) $(ZLIB_INCLUDES) \ +AM_CPPFLAGS += -I$(srcdir)/.. \ + $(BOOST_INCLUDES) $(ICONV_INCLUDES) $(ZLIB_INCLUDES) \ $(QT_CPPFLAGS) $(QT_INCLUDES) liblyxsupport_a_SOURCES = \ diff --git a/src/tex2lyx/Makefile.am b/src/tex2lyx/Makefile.am index e29356754f..bf2d66d67f 100644 --- a/src/tex2lyx/Makefile.am +++ b/src/tex2lyx/Makefile.am @@ -19,7 +19,7 @@ DEFAULT_INCLUDES = AM_CPPFLAGS += -I$(top_srcdir)/src/tex2lyx \ -I$(top_srcdir)/src -I$(top_builddir) -I$(top_builddir)/src \ - $(BOOST_INCLUDES) $(ZLIB_INCLUDES) + $(BOOST_INCLUDES) $(ICONV_INCLUDES) $(ZLIB_INCLUDES) TEST_FILES = \ test/runtests.cmake \ @@ -125,7 +125,7 @@ tex2lyx_LDADD = \ $(top_builddir)/src/support/liblyxsupport.a \ $(LIBICONV) $(BOOST_LIBS) \ $(QT_LIB) $(QT_LDFLAGS) \ - @LIBS@ $(ZLIB_LIBS) $(LIBSHLWAPI) $(LIBPSAPI) + @LIBS@ $(ICONV_LIBS) $(ZLIB_LIBS) $(LIBSHLWAPI) $(LIBPSAPI) if INSTALL_MACOSX tex2lyx_LDFLAGS = -framework AppKit \ From fddaa6adebcb78a513dfb401711b0ea04d70d8f9 Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Thu, 5 May 2016 20:13:56 +0200 Subject: [PATCH 29/76] Make windres configurable The windres program is typically not called windres for cross compilation. Now you can call configure with the argument WINDRES=x86_64-w64-mingw32-windres in order to use the windres program on a standard debian installation. --- configure.ac | 2 ++ src/Makefile.am | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 3b1a900ddb..0cc706c60e 100644 --- a/configure.ac +++ b/configure.ac @@ -117,6 +117,8 @@ AC_CHECK_LIB(psapi, main, [LIBPSAPI=-lpsapi]) AC_SUBST(LIBPSAPI) AC_CHECK_LIB(gdi32, main) AC_CHECK_LIB(ole32, main) +test x"$WINDRES" = x && WINDRES=windres +AC_SUBST(WINDRES) LYX_USE_INCLUDED_BOOST LYX_USE_INCLUDED_MYTHES diff --git a/src/Makefile.am b/src/Makefile.am index 8166b11ff4..57f66d9070 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -42,7 +42,7 @@ lyx_LDADD = \ if LYX_WIN_RESOURCE .rc.o: cp $(top_srcdir)/development/Win32/packaging/icons/lyx_*32x32.ico . - windres -I$(top_builddir) --preprocessor "$(CPP) -xc-header -DRC_INVOKED" $< -o $@ + $(WINDRES) -I$(top_builddir) --preprocessor "$(CPP) -xc-header -DRC_INVOKED" $< -o $@ endif if INSTALL_MACOSX From d8831eff15e6ba953b49287a3b37ab784f79c505 Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Thu, 5 May 2016 20:28:28 +0200 Subject: [PATCH 30/76] Show help for WINDRES in configure This is the official way to declare environment variables --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 0cc706c60e..7b8b742a63 100644 --- a/configure.ac +++ b/configure.ac @@ -118,7 +118,7 @@ AC_SUBST(LIBPSAPI) AC_CHECK_LIB(gdi32, main) AC_CHECK_LIB(ole32, main) test x"$WINDRES" = x && WINDRES=windres -AC_SUBST(WINDRES) +AC_ARG_VAR(WINDRES, [windows resource compiler command]) LYX_USE_INCLUDED_BOOST LYX_USE_INCLUDED_MYTHES From ee18af67cde868032f6a18db798ac6c07922f5d0 Mon Sep 17 00:00:00 2001 From: Guillaume Munch Date: Thu, 5 May 2016 22:01:19 +0100 Subject: [PATCH 31/76] Show review toolbar when outputting changes "Output changes" alters the preamble even in the absence of tracked changes. Therefore, not being able to notice when it is activated can possibly yield hard-to-debug compilation failures. --- src/frontends/qt4/GuiView.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/frontends/qt4/GuiView.cpp b/src/frontends/qt4/GuiView.cpp index d228ca470d..6bfcdcb032 100644 --- a/src/frontends/qt4/GuiView.cpp +++ b/src/frontends/qt4/GuiView.cpp @@ -1554,7 +1554,9 @@ void GuiView::updateToolbars() context |= Toolbars::TABLE; if (currentBufferView()->buffer().areChangesPresent() || (lyx::getStatus(FuncRequest(LFUN_CHANGES_TRACK)).enabled() - && lyx::getStatus(FuncRequest(LFUN_CHANGES_TRACK)).onOff(true))) + && lyx::getStatus(FuncRequest(LFUN_CHANGES_TRACK)).onOff(true)) + || (lyx::getStatus(FuncRequest(LFUN_CHANGES_OUTPUT)).enabled() + && lyx::getStatus(FuncRequest(LFUN_CHANGES_OUTPUT)).onOff(true))) context |= Toolbars::REVIEW; if (lyx::getStatus(FuncRequest(LFUN_IN_MATHMACROTEMPLATE)).enabled()) context |= Toolbars::MATHMACROTEMPLATE; From d5fb80ed874057da0d0b31b836052b9fa35ba269 Mon Sep 17 00:00:00 2001 From: Stephan Witt Date: Sat, 7 May 2016 09:56:03 +0200 Subject: [PATCH 32/76] Remove special code for Qt5 to manage HiDPI. It's not needed anymore and leads to strange icon scaling problems in mixed resolution environment. For reference see the screen shots in bug tracker ticket #10114. --- src/frontends/qt4/GuiApplication.cpp | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/src/frontends/qt4/GuiApplication.cpp b/src/frontends/qt4/GuiApplication.cpp index d64c9619fc..9c7c288fae 100644 --- a/src/frontends/qt4/GuiApplication.cpp +++ b/src/frontends/qt4/GuiApplication.cpp @@ -553,18 +553,7 @@ QString iconName(FuncRequest const & f, bool unknown) bool getPixmap(QPixmap & pixmap, QString const & path) { - if (pixmap.load(path)) { -#if QT_VERSION >= 0x050000 - if (path.endsWith(".svgz") || path.endsWith(".svg") ) { - GuiApplication const * guiApp = theGuiApp(); - if (guiApp != 0) { - pixmap.setDevicePixelRatio(guiApp->pixelRatio()); - } - } -#endif - return true; - } - return false; + return pixmap.load(path); } From 797f12c29adea02b010c28310667124257c17820 Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Sat, 7 May 2016 12:33:47 +0200 Subject: [PATCH 33/76] Ensure unix line ends for configure.ac On windows, configure.ac needs to have unix line ends if you want to run autogen.sh (see #10053). It is no poblem to force unix line ends, since you need to run autogen.sh under mingw or cygwin shell anyway, and if you neither have mingw nor cygwin, then configure.ac is of no use for you. --- .gitattributes | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..51a1fc9aba --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +# configure.ac needs to have unix line ends on windows, see #10053 +configure.ac eol=lf + From 26526b13c59bd64f2c06effb48b35c7c72b9bf09 Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Sun, 8 May 2016 10:16:12 +0200 Subject: [PATCH 34/76] Properly check for windres Use the standard way to check for the resource compiler, as e.g. libtool does it: AC_CHECK_TOOL does already provide some cross compiling magic, and we do also get an error now at configure time if windres is not found. --- configure.ac | 8 ++++++-- src/Makefile.am | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 7b8b742a63..0b7a64bad4 100644 --- a/configure.ac +++ b/configure.ac @@ -117,8 +117,6 @@ AC_CHECK_LIB(psapi, main, [LIBPSAPI=-lpsapi]) AC_SUBST(LIBPSAPI) AC_CHECK_LIB(gdi32, main) AC_CHECK_LIB(ole32, main) -test x"$WINDRES" = x && WINDRES=windres -AC_ARG_VAR(WINDRES, [windows resource compiler command]) LYX_USE_INCLUDED_BOOST LYX_USE_INCLUDED_MYTHES @@ -237,6 +235,12 @@ lyx_win_res=false; case ${host} in *mingw*|*cygwin*) lyx_win_res=true;; esac +if test "x$lyx_win_res" = "xtrue"; then + AC_CHECK_TOOL(RC, windres,) + if test -z "$RC"; then + AC_ERROR([Could not find a resource compiler]) + fi +fi AM_CONDITIONAL(LYX_WIN_RESOURCE, $lyx_win_res) LYX_SET_VERSION_INFO diff --git a/src/Makefile.am b/src/Makefile.am index 57f66d9070..90fb3e65af 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -42,7 +42,7 @@ lyx_LDADD = \ if LYX_WIN_RESOURCE .rc.o: cp $(top_srcdir)/development/Win32/packaging/icons/lyx_*32x32.ico . - $(WINDRES) -I$(top_builddir) --preprocessor "$(CPP) -xc-header -DRC_INVOKED" $< -o $@ + $(RC) -I$(top_builddir) --preprocessor "$(CPP) -xc-header -DRC_INVOKED" $< -o $@ endif if INSTALL_MACOSX From d5d2aa9de945a03e1f84b6e51989e0466cc9bf1c Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Sun, 8 May 2016 10:51:51 +0200 Subject: [PATCH 35/76] Fix compiler warnings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Only the ones I understand (DWORD is always unsigned). There are more: ../../src/Server.cpp: In member function ‘bool lyx::LyXComm::pipeServer()’: ../../src/Server.cpp:280:10: warning: enumeration value ‘CONNECTING_STATE’ not handled in switch [-Wswitch] switch (pipe_[i].state) { ^ ../../src/Server.cpp:347:8: warning: ‘success’ may be used uninitialized in this function [-Wmaybe-uninitialized] && status == pipe_[i].iobuf.length()) { ^ --- src/Server.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Server.cpp b/src/Server.cpp index b7fa35ee13..1a66682bc4 100644 --- a/src/Server.cpp +++ b/src/Server.cpp @@ -136,7 +136,7 @@ DWORD WINAPI pipeServerWrapper(void * arg) LyXComm::LyXComm(string const & pip, Server * cli, ClientCallbackfct ccb) - : pipename_(pip), client_(cli), clientcb_(ccb), stopserver_(0) + : stopserver_(0), pipename_(pip), client_(cli), clientcb_(ccb) { for (int i = 0; i < MAX_PIPES; ++i) { event_[i] = 0; @@ -209,7 +209,7 @@ bool LyXComm::pipeServer() // Determine which pipe instance completed the operation. i = wait - WAIT_OBJECT_0; - LASSERT(i >= 0 && i <= MAX_PIPES, /**/); + LASSERT(i <= MAX_PIPES, /**/); // Check whether we were waked up for stopping the pipe server. if (i == MAX_PIPES) From f434fd22b1b84360f15c31cc9f1cf6567150356c Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Sun, 8 May 2016 11:53:34 +0200 Subject: [PATCH 36/76] Configure included hunspell with autotools The included hunspell should not be used on Linux or OS X, but (depending on local configuration) it might be needed for crosscompiling a mingw target from Linux. Now the user can choose whether to use the included hunspell or not. cmake does already support that. Now the only other dependency you need to cross-compile for mingw on debian or ubuntu is qt. --- 3rdparty/Makefile.am | 6 +++++- 3rdparty/hunspell/Makefile.am | 9 ++++----- config/spell.m4 | 37 ++++++++++++++++++++++++++++++----- 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/3rdparty/Makefile.am b/3rdparty/Makefile.am index f936a4c753..c32db865b8 100644 --- a/3rdparty/Makefile.am +++ b/3rdparty/Makefile.am @@ -6,6 +6,10 @@ if USE_INCLUDED_BOOST BOOST = boost endif +if USE_INCLUDED_HUNSPELL +HUNSPELL = hunspell +endif + if USE_INCLUDED_ICONV ICONV = libiconv endif @@ -14,4 +18,4 @@ if USE_INCLUDED_ZLIB ZLIB = zlib endif -SUBDIRS = $(BOOST) $(ICONV) $(ZLIB) +SUBDIRS = $(BOOST) $(HUNSPELL) $(ICONV) $(ZLIB) diff --git a/3rdparty/hunspell/Makefile.am b/3rdparty/hunspell/Makefile.am index a4e3aeb373..8a5b31283c 100644 --- a/3rdparty/hunspell/Makefile.am +++ b/3rdparty/hunspell/Makefile.am @@ -1,8 +1,5 @@ include $(top_srcdir)/config/common.am -# This is prepared for compilation, but currently only used for packaging, -# because configure support for compilation is still missing. - noinst_LIBRARIES = liblyxhunspell.a EXTRA_DIST = \ @@ -20,7 +17,10 @@ EXTRA_DIST = \ 1.3.3/src/hunspell/license.hunspell \ 1.3.3/src/hunspell/license.myspell \ 1.3.3/src/hunspell/makefile.mk \ - 1.3.3/src/hunspell/README + 1.3.3/src/hunspell/README \ + 1.3.3/src/hunspell/utf_info.cxx + +AM_CPPFLAGS += -DHUNSPELL_STATIC liblyxhunspell_a_SOURCES = \ 1.3.3/src/hunspell/affentry.cxx \ @@ -51,7 +51,6 @@ liblyxhunspell_a_SOURCES = \ 1.3.3/src/hunspell/replist.hxx \ 1.3.3/src/hunspell/suggestmgr.cxx \ 1.3.3/src/hunspell/suggestmgr.hxx \ - 1.3.3/src/hunspell/utf_info.cxx \ 1.3.3/src/hunspell/w_char.hxx \ 1.3.3/src/parsers/firstparser.cxx \ 1.3.3/src/parsers/firstparser.hxx \ diff --git a/config/spell.m4 b/config/spell.m4 index 1a2a1e9522..fffad96aa5 100644 --- a/config/spell.m4 +++ b/config/spell.m4 @@ -68,16 +68,43 @@ AC_DEFUN([CHECK_WITH_HUNSPELL], fi ]) +dnl Usage: LYX_USE_INCLUDED_HUNSPELL : select if the included hunspell should +dnl be used. +AC_DEFUN([LYX_USE_INCLUDED_HUNSPELL],[ + AC_MSG_CHECKING([whether to use included hunspell library]) + AC_ARG_WITH(included-hunspell, + [AC_HELP_STRING([--without-included-hunspell], [do not use the hunspell lib supplied with LyX, try to find one in the system directories - compilation will abort if nothing suitable is found])], + [lyx_cv_with_included_hunspell=$withval], + [lyx_cv_with_included_hunspell=no]) + AM_CONDITIONAL(USE_INCLUDED_HUNSPELL, test x$lyx_cv_with_included_hunspell = xyes) + AC_MSG_RESULT([$lyx_cv_with_included_hunspell]) + if test x$lyx_cv_with_included_hunspell = xyes ; then + HUNSPELL_CFLAGS='-I$(top_srcdir)/3rdparty/hunspell/1.3.3/src' + HUNSPELL_LIBS='$(top_builddir)/3rdparty/hunspell/liblyxhunspell.a' + AC_SUBST(HUNSPELL_CFLAGS) + AC_SUBST(HUNSPELL_LIBS) + fi + ]) + ### Check if we want spell libraries, prefer new aspell or hunspell AC_DEFUN([LYX_CHECK_SPELL_ENGINES], [ - CHECK_WITH_ASPELL + LYX_USE_INCLUDED_HUNSPELL + if test x$lyx_cv_with_included_hunspell = xyes ; then +dnl the user wanted to use the included hunspell, so do not check for the other spell checkers + lyx_use_aspell=false + lyx_use_enchant=false + lyx_use_hunspell=true + lyx_flags="$lyx_flags use-hunspell" + else + CHECK_WITH_ASPELL + CHECK_WITH_ENCHANT + CHECK_WITH_HUNSPELL + fi + AM_CONDITIONAL(USE_ASPELL, $lyx_use_aspell) - - CHECK_WITH_ENCHANT AM_CONDITIONAL(USE_ENCHANT, $lyx_use_enchant) - - CHECK_WITH_HUNSPELL AM_CONDITIONAL(USE_HUNSPELL, $lyx_use_hunspell) ]) + From d2e3a201b9595c6a43fd8457fe9b91d49c6f6c5c Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Sun, 8 May 2016 12:18:07 +0200 Subject: [PATCH 37/76] Do not redefine WINVER Compiling different parts of the sources with different WINVER may lead to subtle and hard to detect problems. Better use the same value everywhere. The existing error message suggests that this was wanted anyway, and it fixes a compiler warning when cross-compiling for mingw on linux. Our code does not require a specific value, only a minimum value of 0x5000, which means the resulting executable will require at least Windows 2000. --- src/support/os_win32.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/support/os_win32.h b/src/support/os_win32.h index 618c5315ef..42016f7094 100644 --- a/src/support/os_win32.h +++ b/src/support/os_win32.h @@ -35,10 +35,13 @@ * Note: __CYGWIN__ can be defined here if building in _WIN32 mode. */ #if defined(__MINGW32__) || defined(__CYGWIN__) || defined(__CYGWIN32__) -# if defined(WINVER) && WINVER < 0x0500 -# error WINVER must be >= 0x0500 +# if defined(WINVER) +# if WINVER < 0x0500 +# error WINVER must be >= 0x0500 +# endif +# else +# define WINVER 0x0500 # endif -# define WINVER 0x0500 # define _WIN32_IE 0x0500 #endif From cfa0eea4b96e5596dabbce77726fee7f18ecc680 Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Sun, 8 May 2016 12:25:09 +0200 Subject: [PATCH 38/76] Fix compiler warnings --- src/frontends/qt4/GuiApplication.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/frontends/qt4/GuiApplication.cpp b/src/frontends/qt4/GuiApplication.cpp index 9c7c288fae..b3efd78a09 100644 --- a/src/frontends/qt4/GuiApplication.cpp +++ b/src/frontends/qt4/GuiApplication.cpp @@ -754,8 +754,8 @@ class QWindowsMimeMetafile : public QWINDOWSMIME { public: QWindowsMimeMetafile() {} - bool canConvertFromMime(FORMATETC const & formatetc, - QMimeData const * mimedata) const + bool canConvertFromMime(FORMATETC const & /*formatetc*/, + QMimeData const * /*mimedata*/) const { return false; } @@ -769,14 +769,14 @@ public: return pDataObj->QueryGetData(&formatetc) == S_OK; } - bool convertFromMime(FORMATETC const & formatetc, - const QMimeData * mimedata, STGMEDIUM * pmedium) const + bool convertFromMime(FORMATETC const & /*formatetc*/, + const QMimeData * /*mimedata*/, STGMEDIUM * /*pmedium*/) const { return false; } QVariant convertToMime(QString const & mimetype, IDataObject * pDataObj, - QVariant::Type preferredType) const + QVariant::Type /*preferredType*/) const { QByteArray data; if (!canConvertToMime(mimetype, pDataObj)) @@ -807,7 +807,7 @@ public: QVector formatsForMime(QString const & mimetype, - QMimeData const * mimedata) const + QMimeData const * /*mimedata*/) const { QVector formats; if (mimetype == emfMimeType() || mimetype == wmfMimeType()) From c8619110ff6b2d2b1eb77654ed3f6320a442617d Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Sun, 8 May 2016 13:46:35 +0200 Subject: [PATCH 39/76] Fix packaging for mingw crosscompilation The standard host triplet for mingw tools is is something like x86_64-w64-mingw32 on debian and something like x86-64-w64-mingw32.shared for mxe (http://mxe.cc). Detect windows packaging correctly for these build types. --- config/lyxinclude.m4 | 1 + 1 file changed, 1 insertion(+) diff --git a/config/lyxinclude.m4 b/config/lyxinclude.m4 index 84f66880a2..1f1fdb67e7 100644 --- a/config/lyxinclude.m4 +++ b/config/lyxinclude.m4 @@ -695,6 +695,7 @@ AC_ARG_WITH(packaging, case $host in *-apple-darwin*) lyx_use_packaging=macosx ;; *-pc-mingw*) lyx_use_packaging=windows ;; + *-mingw32*) lyx_use_packaging=windows ;; *haiku*) lyx_use_packaging=haiku ;; *) lyx_use_packaging=posix ;; esac]) From 78d6c2f331dae8a13d0924e86408058d0a9cc822 Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Sun, 8 May 2016 14:30:09 +0200 Subject: [PATCH 40/76] Describe cross-compilation with MXE MXE is really a great project: It provides a cross-compilation environment for compiling windows binaries using mingw from any unix system, and includes lots of prepackaged libraries. The latter distinguishes it from the mingw cross-compilers packaged with some linux distros such as debian. I was even able to run the resulting lyx.exe using wine! --- INSTALL.Win32 | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/INSTALL.Win32 b/INSTALL.Win32 index abd3601d50..1cc9928216 100644 --- a/INSTALL.Win32 +++ b/INSTALL.Win32 @@ -121,3 +121,31 @@ Compiling with GCC with MinGW64 + MSYS2 Environment using autotools make make install + +Cross-Compiling on unix with MXE using autotools +================================================= +1 Install MXE: http://mxe.cc + You can either install from sources, the generic .tar binaries or debian .deb packages. + Installing the following .deb packages will drag in all needed dependencies: + mxe-x86-64-w64-mingw32.shared-file + mxe-x86-64-w64-mingw32.shared-gcc + mxe-x86-64-w64-mingw32.shared-libiconv + mxe-x86-64-w64-mingw32.shared-qtimageformats + mxe-x86-64-w64-mingw32.shared-qtsvg + mxe-x86-64-w64-mingw32.shared-qtwinextras + Of course you can also use the static and/or 32bit versions. +2 Run the standard autotools install (Adapt paths and arguments accordingly) + ./autogen.sh + mkdir builddir-mingw + cd builddir-mingw + PATH="/usr/lib/mxe/usr/bin:$PATH" ../configure --host=x86-64-w64-mingw32.shared --with-qt-dir=/usr/lib/mxe/usr/x86_64-w64-mingw32.shared/qt5 --enable-qt5 --with-included-boost --with-included-hunspell --with-included-mythes --disable-debug --enable-optimization --prefix=/mingw64 + PATH="/usr/lib/mxe/usr/bin:$PATH" make + PATH="/usr/lib/mxe/usr/bin:$PATH" DESTDIR=/tmp/lyxinstall make install + This uses the paths from the 64bit shared MXE version installed from .deb packages. +3 If you want to run the resulting lyx.exe from the build directory using wine, + create symlinks for all needed .dlls: + cd builddir-mingw/src + ln -s /usr/lib/mxe/usr/x86_64-w64-mingw32.shared/bin/*.dll . + ln -s /usr/lib/mxe/usr/x86_64-w64-mingw32.shared/qt5/bin/*.dll . + wine64 lyx.exe + From ba6d84c917c9b562a417110f6d58424e54721a66 Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Sun, 8 May 2016 22:08:17 +0200 Subject: [PATCH 41/76] Always use unix line ends in .pot files Otherwise gettext creates files with stray '\r' in comment lines on windows. --- po/lyx_pot.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/po/lyx_pot.py b/po/lyx_pot.py index 500185fdba..a58d8bfe06 100755 --- a/po/lyx_pot.py +++ b/po/lyx_pot.py @@ -44,7 +44,7 @@ def writeString(outfile, infile, basefile, lineno, string): def ui_l10n(input_files, output, base): '''Generate pot file from lib/ui/*''' - output = io.open(output, 'w', encoding='utf_8') + output = io.open(output, 'w', encoding='utf_8', newline='\n') Submenu = re.compile(r'^[^#]*Submenu\s+"([^"]*)"', re.IGNORECASE) Popupmenu = re.compile(r'^[^#]*PopupMenu\s+"[^"]+"\s+"([^"]*)"', re.IGNORECASE) IconPalette = re.compile(r'^[^#]*IconPalette\s+"[^"]+"\s+"([^"]*)"', re.IGNORECASE) @@ -166,7 +166,10 @@ def layouts_l10n(input_files, output, base, layouttranslations): if 'wa' in languages: languages.remove('wa') - out = io.open(output, 'w', encoding='utf_8') + if layouttranslations: + out = io.open(output, 'w', encoding='utf_8') + else: + out = io.open(output, 'w', encoding='utf_8', newline='\n') for src in input_files: readingDescription = False readingI18nPreamble = False @@ -433,7 +436,7 @@ def layouts_l10n(input_files, output, base, layouttranslations): def qt4_l10n(input_files, output, base): '''Generate pot file from src/frontends/qt4/ui/*.ui''' - output = io.open(output, 'w', encoding='utf_8') + output = io.open(output, 'w', encoding='utf_8', newline='\n') pat = re.compile(r'\s*(.*)') prop = re.compile(r'\s* Date: Sun, 8 May 2016 23:56:55 +0100 Subject: [PATCH 42/76] fix #9826: Outline disclosure of subsection content disappears one second after doubleclicking content item. This is only meant as a workaround. See #6675 for more general issues regarding unwanted collapse of the tree view. --- src/frontends/qt4/TocWidget.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/frontends/qt4/TocWidget.cpp b/src/frontends/qt4/TocWidget.cpp index 4fa6aef7a3..ff929c08f7 100644 --- a/src/frontends/qt4/TocWidget.cpp +++ b/src/frontends/qt4/TocWidget.cpp @@ -47,7 +47,6 @@ TocWidget::TocWidget(GuiView & gui_view, QWidget * parent) : QWidget(parent), depth_(0), persistent_(false), gui_view_(gui_view), update_timer_short_(new QTimer(this)), update_timer_long_(new QTimer(this)) - { setupUi(this); @@ -98,6 +97,13 @@ TocWidget::TocWidget(GuiView & gui_view, QWidget * parent) connect(update_timer_long_, SIGNAL(timeout()), this, SLOT(realUpdateView())); + // fix #9826: Outline disclosure of subsection content disappears one second + // after doubleclicking content item. + // This is only meant as a workaround. See #6675 for more general issues + // regarding unwanted collapse of the tree view. + connect(tocTV, SIGNAL(expanded(const QModelIndex &)), + update_timer_long_, SLOT(stop())); + init(QString()); } @@ -399,12 +405,14 @@ void TocWidget::updateView() update_timer_long_->start(); } + void TocWidget::updateViewNow() { update_timer_long_->stop(); update_timer_short_->start(); } + void TocWidget::realUpdateView() { if (!gui_view_.documentBufferView()) { From 2d708bd7cf802fd76617e7255f81efec7d4c1adf Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Tue, 10 May 2016 07:03:54 +0200 Subject: [PATCH 43/76] Simplify .po file generation We can generate the file with the cirrect line endings directly instead of calling a helper script to convert them. --- development/Makefile.am | 1 - development/cmake/po/cat.py | 10 ++++++++-- development/cmake/po/dos2unix.py | 17 ----------------- po/CMakeLists.txt | 2 -- 4 files changed, 8 insertions(+), 22 deletions(-) delete mode 100644 development/cmake/po/dos2unix.py diff --git a/development/Makefile.am b/development/Makefile.am index 43ca80821e..796e964d4a 100644 --- a/development/Makefile.am +++ b/development/Makefile.am @@ -159,7 +159,6 @@ cmake/modules/PCHSupport_26.cmake \ cmake/modules/ProjectSourceGroup.cmake \ cmake/pcheaders.h \ cmake/po/cat.py \ -cmake/po/dos2unix.py \ cmake/po/unix2dos.py \ cmake/post_install/CMakeLists.txt \ cmake/scripts/LyXCreateImagesResource.cmake \ diff --git a/development/cmake/po/cat.py b/development/cmake/po/cat.py index 02655dc564..7a1ee2699b 100644 --- a/development/cmake/po/cat.py +++ b/development/cmake/po/cat.py @@ -25,11 +25,17 @@ for (opt, param) in options: out = sys.stdout if outfile: - out = open(outfile, "w") + # always write unix line endings, even on windows + out = open(outfile, "wb") for f in args: - fil = open(f, "r") + # accept both windows and unix line endings, since it can happen that we + # are on unix, but the file has been written on windows or vice versa. + fil = open(f, "rU") for l in fil: + # this does always write unix line endings since the file has + # been opened in binary mode. This is needed since both gettext + # and our .pot file manipulation scripts assume unix line ends. out.write(l) fil.close() diff --git a/development/cmake/po/dos2unix.py b/development/cmake/po/dos2unix.py deleted file mode 100644 index a5b6431429..0000000000 --- a/development/cmake/po/dos2unix.py +++ /dev/null @@ -1,17 +0,0 @@ -#! /usr/bin/env python - -############### -import sys - -for fname in sys.argv[1:]: - infile = open( fname, "r" ) - instr = infile.read() - infile.close() - outstr = instr.replace( "\r\n", "\n" ).replace( "\r", "\n" ) - - if outstr == instr: - continue - - outfile = open( fname , "w" ) - outfile.write( outstr ) - outfile.close() diff --git a/po/CMakeLists.txt b/po/CMakeLists.txt index 4d70d24042..3f2f9ad7e7 100755 --- a/po/CMakeLists.txt +++ b/po/CMakeLists.txt @@ -90,8 +90,6 @@ ADD_CUSTOM_COMMAND( OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${_lyxname}.cat.pot" COMMAND ${LYX_PYTHON_EXECUTABLE} ARGS "${TOP_CMAKE_PATH}/po/cat.py" ${_py_sources} > "${CMAKE_CURRENT_BINARY_DIR}/${_lyxname}.cat_tmp.pot" - COMMAND ${LYX_PYTHON_EXECUTABLE} - ARGS "${TOP_CMAKE_PATH}/po/dos2unix.py" "${CMAKE_CURRENT_BINARY_DIR}/${_lyxname}.cat_tmp.pot" COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_BINARY_DIR}/${_lyxname}.cat_tmp.pot" "${CMAKE_CURRENT_BINARY_DIR}/${_lyxname}.cat.pot" DEPENDS ${_py_sources} From 26308c1d6bb8bfe5c891f3d8d8fc1ddf30248ba5 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Tue, 10 May 2016 11:17:43 +0200 Subject: [PATCH 44/76] Disable LFUN_INSET_DISSOLVE in tabulars When in a tabular cell, "this" is just a lone InsetText, while cur.inset() is the whole tabular. This makes a big difference, especially when one wants to count cells. Fixes bug "9954. --- src/insets/InsetText.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/insets/InsetText.cpp b/src/insets/InsetText.cpp index 80b0bac013..660826309f 100644 --- a/src/insets/InsetText.cpp +++ b/src/insets/InsetText.cpp @@ -293,7 +293,8 @@ void InsetText::doDispatch(Cursor & cur, FuncRequest & cmd) bool const main_inset = &buffer().inset() == this; bool const target_inset = cmd.argument().empty() || cmd.getArg(0) == insetName(lyxCode()); - bool const one_cell = nargs() == 1; + // cur.inset() is the tabular when this is a single cell (bug #9954) + bool const one_cell = cur.inset().nargs() == 1; if (!main_inset && target_inset && one_cell) { // Text::dissolveInset assumes that the cursor @@ -325,7 +326,8 @@ bool InsetText::getStatus(Cursor & cur, FuncRequest const & cmd, bool const main_inset = &buffer().inset() == this; bool const target_inset = cmd.argument().empty() || cmd.getArg(0) == insetName(lyxCode()); - bool const one_cell = nargs() == 1; + // cur.inset() is the tabular when this is a single cell (bug #9954) + bool const one_cell = cur.inset().nargs() == 1; if (target_inset) status.setEnabled(!main_inset && one_cell); From 3a2fc1595b316e0847d25b0604ec9188d953af01 Mon Sep 17 00:00:00 2001 From: Stephan Witt Date: Tue, 10 May 2016 18:06:48 +0200 Subject: [PATCH 45/76] Correct path names were to look for RPM based dictionaries for hunspell on Linux. --- src/HunspellChecker.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/HunspellChecker.cpp b/src/HunspellChecker.cpp index 5c179762ac..ec5466f300 100644 --- a/src/HunspellChecker.cpp +++ b/src/HunspellChecker.cpp @@ -155,9 +155,9 @@ const string HunspellChecker::Private::dictPath(int selector) { switch (selector) { case 4: - return addName(hunspellPackageDictDirectory(),dictDirectory()); + return hunspellPackageDictDirectory(); case 3: - return addName(myspellPackageDictDirectory(),dictDirectory()); + return myspellPackageDictDirectory(); case 2: return addName(package().system_support().absFileName(),dictDirectory()); case 1: From b8be856f7902d25ff6a219f0adeeff9935b7307a Mon Sep 17 00:00:00 2001 From: Stephan Witt Date: Tue, 10 May 2016 18:08:05 +0200 Subject: [PATCH 46/76] Remove unused include file. --- src/AppleSpellChecker.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/AppleSpellChecker.cpp b/src/AppleSpellChecker.cpp index 189ada71cf..6020de7f27 100644 --- a/src/AppleSpellChecker.cpp +++ b/src/AppleSpellChecker.cpp @@ -13,7 +13,6 @@ #include "AppleSpellChecker.h" #include "WordLangTuple.h" -#include "support/lassert.h" #include "support/debug.h" #include "support/docstring_list.h" #include "support/AppleSpeller.h" From 5a76e5581f519fa8da18ec1db7871a3cfdd69d2f Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Wed, 11 May 2016 17:09:34 +0200 Subject: [PATCH 47/76] Do not use 'u' flag for ar The Reproducible Builds effort (https://wiki.debian.org/ReproducibleBuilds) in Debian (at least) means that 'ar' is built in deterministic mode as default: all timestamps are set to 0. This is not compatible with the use of the 'u' flag, and therefore ARFLAGS has to be changed from 'cru' to 'cr'. This gets rid of the harmless but annoying warning ar: `u' modifier ignored since `D' is the default (see `U') --- configure.ac | 3 +++ 1 file changed, 3 insertions(+) diff --git a/configure.ac b/configure.ac index 0b7a64bad4..3d88a08fb0 100644 --- a/configure.ac +++ b/configure.ac @@ -74,6 +74,9 @@ AM_PATH_PYTHON # Tools for creating libraries (note that we do not use libtool) m4_ifdef([AM_PROG_AR], [AM_PROG_AR]) dnl AM_PROG_AR requires automake 1.12 AC_PROG_RANLIB +dnl Recent debian/ubuntu (at least) have built 'ar' so that deterministic mode is the default. +dnl This means that it does not make sense to use the 'u' flag (default ARFLAGS is 'cru'). +AC_SUBST([ARFLAGS], [cr]) ### Check for a C++ compiler dnl We have to do weird tricks so that autoconf does not touch CXXFLAGS even From 282fe102f3dd8c2e3759612188415fda8adc3f94 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Thu, 12 May 2016 09:24:55 +0200 Subject: [PATCH 48/76] Fix getStatus for math-mutate and math-display Those two functions used two different hackish and buggy implementation to know when the function is disabled. Replace that by asking the containing inset whether it accepts inserting display math inset. Fixes bug #10033. --- src/mathed/InsetMathHull.cpp | 38 ++++++++++++++++-------------------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/src/mathed/InsetMathHull.cpp b/src/mathed/InsetMathHull.cpp index efdeb8b056..48792a81ae 100644 --- a/src/mathed/InsetMathHull.cpp +++ b/src/mathed/InsetMathHull.cpp @@ -1870,6 +1870,20 @@ void InsetMathHull::doDispatch(Cursor & cur, FuncRequest & cmd) } +namespace { + +bool allowDisplayMath(Cursor cur) +{ + LATTEST(cur.depth() > 1); + cur.pop(); + FuncStatus status; + FuncRequest cmd(LFUN_MATH_DISPLAY); + return cur.getStatus(cmd, status) && status.enabled(); +} + +} + + bool InsetMathHull::getStatus(Cursor & cur, FuncRequest const & cmd, FuncStatus & status) const { @@ -1896,30 +1910,12 @@ bool InsetMathHull::getStatus(Cursor & cur, FuncRequest const & cmd, status.setOnOff(type_ == ht); status.setEnabled(isMutable(ht) && isMutable(type_)); - if (ht != hullSimple && status.enabled()) { - Cursor tmpcur = cur; - while (!tmpcur.empty()) { - InsetCode code = tmpcur.inset().lyxCode(); - if (code == BOX_CODE) { - return true; - } else if (code == TABULAR_CODE) { - FuncRequest tmpcmd(LFUN_MATH_DISPLAY); - if (tmpcur.getStatus(tmpcmd, status) && !status.enabled()) - return true; - } - tmpcur.pop_back(); - } - } + if (ht != hullSimple && status.enabled()) + status.setEnabled(allowDisplayMath(cur)); return true; } case LFUN_MATH_DISPLAY: { - bool enable = true; - if (cur.depth() > 1) { - Inset const & in = cur[cur.depth()-2].inset(); - if (in.lyxCode() == SCRIPT_CODE) - enable = display() != Inline; - } - status.setEnabled(enable); + status.setEnabled(display() != Inline || allowDisplayMath(cur)); status.setOnOff(display() != Inline); return true; } From 7628f0bf977e1a1d07556f1a62753d868d7fb925 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Fri, 22 Apr 2016 14:57:12 +0200 Subject: [PATCH 49/76] \\pagebreak is a fragile command in general As such, it shall be protected in moving arguments, such as sections. Fixes bug #10092. --- src/insets/InsetNewpage.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/insets/InsetNewpage.cpp b/src/insets/InsetNewpage.cpp index 5e98428fcd..418bf8b361 100644 --- a/src/insets/InsetNewpage.cpp +++ b/src/insets/InsetNewpage.cpp @@ -212,13 +212,15 @@ ColorCode InsetNewpage::ColorName() const } -void InsetNewpage::latex(otexstream & os, OutputParams const &) const +void InsetNewpage::latex(otexstream & os, OutputParams const & runparams) const { switch (params_.kind) { case InsetNewpageParams::NEWPAGE: os << "\\newpage{}"; break; case InsetNewpageParams::PAGEBREAK: + if (runparams.moving_arg) + os << "\\protect"; os << "\\pagebreak{}"; break; case InsetNewpageParams::CLEARPAGE: From b6390569819a957c0f58b8d73ce9cdb94a9356df Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Thu, 19 May 2016 11:47:26 +0200 Subject: [PATCH 50/76] Remove declaration of classes that do not exist Some headers contain class Foo; whereas there is no class Foo. The list of class statements is given by classes=`git grep '^\(class\|struct\) [a-zA-Z_:]*;' src | sed 's/^.* \(.*\);/\1/'|sort -u` The ones that are useless are: for c in $classes ; do grep -r "\\<$c\\>" src| grep -vq '^[^:]*:\(class\|struct\) [a-zA-Z_:]*;' || echo "$c"; done --- src/BufferParams.h | 1 - src/Paragraph.h | 2 -- src/insets/RenderPreview.h | 1 - src/mathed/InsetMath.h | 2 -- 4 files changed, 6 deletions(-) diff --git a/src/BufferParams.h b/src/BufferParams.h index caae01dfec..f62911c262 100644 --- a/src/BufferParams.h +++ b/src/BufferParams.h @@ -42,7 +42,6 @@ class Font; class HSpace; class IndicesList; class Language; -class LatexFeatures; class LayoutFile; class LayoutFileIndex; class Lexer; diff --git a/src/Paragraph.h b/src/Paragraph.h index 6f8d248ca0..50516d77ae 100644 --- a/src/Paragraph.h +++ b/src/Paragraph.h @@ -39,12 +39,10 @@ class DocumentClass; class Inset; class InsetBibitem; class LaTeXFeatures; -class Inset_code; class InsetList; class Language; class Layout; class Font; -class Font_size; class MetricsInfo; class OutputParams; class PainterInfo; diff --git a/src/insets/RenderPreview.h b/src/insets/RenderPreview.h index cc7a4b6928..83febb3bb9 100644 --- a/src/insets/RenderPreview.h +++ b/src/insets/RenderPreview.h @@ -28,7 +28,6 @@ namespace lyx { class Buffer; -class LyXRC_PreviewStatus; class MetricsInfo; class PainterInfo; diff --git a/src/mathed/InsetMath.h b/src/mathed/InsetMath.h index deb6915e9a..b23ffb5179 100644 --- a/src/mathed/InsetMath.h +++ b/src/mathed/InsetMath.h @@ -85,11 +85,9 @@ class MaximaStream; class MathematicaStream; class MathStream; class WriteStream; -class InfoStream; class MathMacroTemplate; class MathMacro; -class MathPosFinder; class Cursor; class TextPainter; class TextMetricsInfo; From 87d4ce0ff7adfd9608b562d620a3e4c57b5082f4 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Thu, 19 May 2016 12:01:08 +0200 Subject: [PATCH 51/76] Remove boost/format support Only ChkTex.cpp used it, whereas the rest of our code uses the simpler bformat. --- 3rdparty/boost/boost/format.hpp | 59 -- 3rdparty/boost/boost/format/alt_sstream.hpp | 176 ----- .../boost/boost/format/alt_sstream_impl.hpp | 313 -------- .../format/detail/compat_workarounds.hpp | 86 --- .../boost/format/detail/config_macros.hpp | 95 --- .../format/detail/msvc_disambiguater.hpp | 54 -- .../boost/format/detail/unset_macros.hpp | 34 - .../format/detail/workarounds_gcc-2_95.hpp | 162 ----- .../format/detail/workarounds_stlport.hpp | 36 - 3rdparty/boost/boost/format/exceptions.hpp | 103 --- 3rdparty/boost/boost/format/feed_args.hpp | 319 -------- 3rdparty/boost/boost/format/format_class.hpp | 168 ----- 3rdparty/boost/boost/format/format_fwd.hpp | 43 -- .../boost/format/format_implementation.hpp | 329 --------- 3rdparty/boost/boost/format/free_funcs.hpp | 70 -- 3rdparty/boost/boost/format/group.hpp | 684 ------------------ 3rdparty/boost/boost/format/internals.hpp | 202 ------ 3rdparty/boost/boost/format/internals_fwd.hpp | 64 -- 3rdparty/boost/boost/format/parsing.hpp | 501 ------------- 3rdparty/boost/extract.sh | 1 - configure.ac | 6 - development/cmake/configCompiler.h.cmake | 6 - development/cmake/configCompiler.h.msvc | 6 - src/Chktex.cpp | 16 +- src/Chktex.h | 1 - 25 files changed, 2 insertions(+), 3532 deletions(-) delete mode 100644 3rdparty/boost/boost/format.hpp delete mode 100644 3rdparty/boost/boost/format/alt_sstream.hpp delete mode 100644 3rdparty/boost/boost/format/alt_sstream_impl.hpp delete mode 100644 3rdparty/boost/boost/format/detail/compat_workarounds.hpp delete mode 100644 3rdparty/boost/boost/format/detail/config_macros.hpp delete mode 100644 3rdparty/boost/boost/format/detail/msvc_disambiguater.hpp delete mode 100644 3rdparty/boost/boost/format/detail/unset_macros.hpp delete mode 100644 3rdparty/boost/boost/format/detail/workarounds_gcc-2_95.hpp delete mode 100644 3rdparty/boost/boost/format/detail/workarounds_stlport.hpp delete mode 100644 3rdparty/boost/boost/format/exceptions.hpp delete mode 100644 3rdparty/boost/boost/format/feed_args.hpp delete mode 100644 3rdparty/boost/boost/format/format_class.hpp delete mode 100644 3rdparty/boost/boost/format/format_fwd.hpp delete mode 100644 3rdparty/boost/boost/format/format_implementation.hpp delete mode 100644 3rdparty/boost/boost/format/free_funcs.hpp delete mode 100644 3rdparty/boost/boost/format/group.hpp delete mode 100644 3rdparty/boost/boost/format/internals.hpp delete mode 100644 3rdparty/boost/boost/format/internals_fwd.hpp delete mode 100644 3rdparty/boost/boost/format/parsing.hpp diff --git a/3rdparty/boost/boost/format.hpp b/3rdparty/boost/boost/format.hpp deleted file mode 100644 index 73464a819f..0000000000 --- a/3rdparty/boost/boost/format.hpp +++ /dev/null @@ -1,59 +0,0 @@ -// ---------------------------------------------------------------------------- -// format.hpp : primary header -// ---------------------------------------------------------------------------- - -// Copyright Samuel Krempp 2003. Use, modification, and distribution are -// subject to the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org/libs/format for library home page - - -// ---------------------------------------------------------------------------- - -#ifndef BOOST_FORMAT_HPP -#define BOOST_FORMAT_HPP - -#include -#include -#include -#include - -#ifndef BOOST_NO_STD_LOCALE -#include -#endif - -// *** Compatibility framework -#include - -#ifdef BOOST_NO_LOCALE_ISIDIGIT -#include // we'll use the non-locale 's std::isdigit(int) -#endif - -// **** Forward declarations ---------------------------------- -#include // basic_format, and other frontends -#include // misc forward declarations for internal use - -// **** Auxiliary structs (stream_format_state , and format_item ) -#include - -// **** Format class interface -------------------------------- -#include - -// **** Exceptions ----------------------------------------------- -#include - -// **** Implementation ------------------------------------------- -#include // member functions -#include // class for grouping arguments -#include // argument-feeding functions -#include // format-string parsing (member-)functions - -// **** Implementation of the free functions ---------------------- -#include - - -// *** Undefine 'local' macros : -#include - -#endif // BOOST_FORMAT_HPP diff --git a/3rdparty/boost/boost/format/alt_sstream.hpp b/3rdparty/boost/boost/format/alt_sstream.hpp deleted file mode 100644 index e236be3526..0000000000 --- a/3rdparty/boost/boost/format/alt_sstream.hpp +++ /dev/null @@ -1,176 +0,0 @@ -// ---------------------------------------------------------------------------- -// alt_sstream.hpp : alternative stringstream -// ---------------------------------------------------------------------------- - -// Copyright Samuel Krempp 2003. Use, modification, and distribution are -// subject to the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org/libs/format for library home page - -// ---------------------------------------------------------------------------- - - - -#ifndef BOOST_SK_ALT_SSTREAM_HPP -#define BOOST_SK_ALT_SSTREAM_HPP - -#include -#include -#include -#include -#include - -namespace boost { - namespace io { - - template, - class Alloc=::std::allocator > - class basic_altstringbuf; - - template, - class Alloc=::std::allocator > - class basic_oaltstringstream; - - - template - class basic_altstringbuf - : public ::std::basic_streambuf - { - typedef ::std::basic_streambuf streambuf_t; - typedef typename CompatAlloc::compatible_type compat_allocator_type; - typedef typename CompatTraits::compatible_type compat_traits_type; - public: - typedef Ch char_type; - typedef Tr traits_type; - typedef typename compat_traits_type::int_type int_type; - typedef typename compat_traits_type::pos_type pos_type; - typedef typename compat_traits_type::off_type off_type; - typedef Alloc allocator_type; - typedef ::std::basic_string string_type; - typedef typename string_type::size_type size_type; - - typedef ::std::streamsize streamsize; - - - explicit basic_altstringbuf(std::ios_base::openmode mode - = std::ios_base::in | std::ios_base::out) - : putend_(NULL), is_allocated_(false), mode_(mode) - {} - explicit basic_altstringbuf(const string_type& s, - ::std::ios_base::openmode mode - = ::std::ios_base::in | ::std::ios_base::out) - : putend_(NULL), is_allocated_(false), mode_(mode) - { dealloc(); str(s); } - virtual ~basic_altstringbuf() - { dealloc(); } - using streambuf_t::pbase; - using streambuf_t::pptr; - using streambuf_t::epptr; - using streambuf_t::eback; - using streambuf_t::gptr; - using streambuf_t::egptr; - - void clear_buffer(); - void str(const string_type& s); - - // 0-copy access : - Ch * begin() const; - size_type size() const; - size_type cur_size() const; // stop at current pointer - Ch * pend() const // the highest position reached by pptr() since creation - { return ((putend_ < pptr()) ? pptr() : putend_); } - size_type pcount() const - { return static_cast( pptr() - pbase()) ;} - - // copy buffer to string : - string_type str() const - { return string_type(begin(), size()); } - string_type cur_str() const - { return string_type(begin(), cur_size()); } - protected: - explicit basic_altstringbuf (basic_altstringbuf * s, - ::std::ios_base::openmode mode - = ::std::ios_base::in | ::std::ios_base::out) - : putend_(NULL), is_allocated_(false), mode_(mode) - { dealloc(); str(s); } - - virtual pos_type seekoff(off_type off, ::std::ios_base::seekdir way, - ::std::ios_base::openmode which - = ::std::ios_base::in | ::std::ios_base::out); - virtual pos_type seekpos (pos_type pos, - ::std::ios_base::openmode which - = ::std::ios_base::in | ::std::ios_base::out); - virtual int_type underflow(); - virtual int_type pbackfail(int_type meta = compat_traits_type::eof()); - virtual int_type overflow(int_type meta = compat_traits_type::eof()); - void dealloc(); - private: - enum { alloc_min = 256}; // minimum size of allocations - - Ch *putend_; // remembers (over seeks) the highest value of pptr() - bool is_allocated_; - ::std::ios_base::openmode mode_; - compat_allocator_type alloc_; // the allocator object - }; - - -// --- class basic_oaltstringstream ---------------------------------------- - template - class basic_oaltstringstream - : private base_from_member< shared_ptr< basic_altstringbuf< Ch, Tr, Alloc> > >, - public ::std::basic_ostream - { - class No_Op { - // used as no-op deleter for (not-owner) shared_pointers - public: - template - const T & operator()(const T & arg) { return arg; } - }; - typedef ::std::basic_ostream stream_t; - typedef boost::base_from_member > > - pbase_type; - typedef ::std::basic_string string_type; - typedef typename string_type::size_type size_type; - typedef basic_altstringbuf stringbuf_t; - public: - typedef Alloc allocator_type; - basic_oaltstringstream() - : pbase_type(new stringbuf_t), stream_t(rdbuf()) - { } - basic_oaltstringstream(::boost::shared_ptr buf) - : pbase_type(buf), stream_t(rdbuf()) - { } - basic_oaltstringstream(stringbuf_t * buf) - : pbase_type(buf, No_Op() ), stream_t(rdbuf()) - { } - stringbuf_t * rdbuf() const - { return pbase_type::member.get(); } - void clear_buffer() - { rdbuf()->clear_buffer(); } - - // 0-copy access : - Ch * begin() const - { return rdbuf()->begin(); } - size_type size() const - { return rdbuf()->size(); } - size_type cur_size() const // stops at current position - { return rdbuf()->cur_size(); } - - // copy buffer to string : - string_type str() const // [pbase, epptr[ - { return rdbuf()->str(); } - string_type cur_str() const // [pbase, pptr[ - { return rdbuf()->cur_str(); } - void str(const string_type& s) - { rdbuf()->str(s); } - }; - - } // N.S. io -} // N.S. boost - -#include - -#endif // include guard - diff --git a/3rdparty/boost/boost/format/alt_sstream_impl.hpp b/3rdparty/boost/boost/format/alt_sstream_impl.hpp deleted file mode 100644 index 9975e4f96b..0000000000 --- a/3rdparty/boost/boost/format/alt_sstream_impl.hpp +++ /dev/null @@ -1,313 +0,0 @@ -// ---------------------------------------------------------------------------- -// alt_sstream_impl.hpp : alternative stringstream, templates implementation -// ---------------------------------------------------------------------------- - -// Copyright Samuel Krempp 2003. Use, modification, and distribution are -// subject to the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org/libs/format for library home page - -// ---------------------------------------------------------------------------- - -#ifndef BOOST_SK_ALT_SSTREAM_IMPL_HPP -#define BOOST_SK_ALT_SSTREAM_IMPL_HPP - -namespace boost { - namespace io { -// --- Implementation ------------------------------------------------------// - - template - void basic_altstringbuf:: - clear_buffer () { - const Ch * p = pptr(); - const Ch * b = pbase(); - if(p != NULL && p != b) { - seekpos(0, ::std::ios_base::out); - } - p = gptr(); - b = eback(); - if(p != NULL && p != b) { - seekpos(0, ::std::ios_base::in); - } - } - - template - void basic_altstringbuf:: - str (const string_type& s) { - size_type sz=s.size(); - if(sz != 0 && mode_ & (::std::ios_base::in | ::std::ios_base::out) ) { -#ifdef _RWSTD_NO_CLASS_PARTIAL_SPEC - void *vd_ptr = alloc_.allocate(sz, is_allocated_? eback() : 0); - Ch *new_ptr = static_cast(vd_ptr); -#else - Ch *new_ptr = alloc_.allocate(sz, is_allocated_? eback() : 0); -#endif - // if this didnt throw, we're safe, update the buffer - dealloc(); - sz = s.copy(new_ptr, sz); - putend_ = new_ptr + sz; - if(mode_ & ::std::ios_base::in) - streambuf_t::setg(new_ptr, new_ptr, new_ptr + sz); - if(mode_ & ::std::ios_base::out) { - streambuf_t::setp(new_ptr, new_ptr + sz); - if(mode_ & (::std::ios_base::app | ::std::ios_base::ate)) - streambuf_t::pbump(static_cast(sz)); - if(gptr() == NULL) - streambuf_t::setg(new_ptr, NULL, new_ptr); - } - is_allocated_ = true; - } - else - dealloc(); - } - template - Ch* basic_altstringbuf:: - begin () const { - if(mode_ & ::std::ios_base::out && pptr() != NULL) - return pbase(); - else if(mode_ & ::std::ios_base::in && gptr() != NULL) - return eback(); - return NULL; - } - - template - typename std::basic_string::size_type - basic_altstringbuf:: - size () const { - if(mode_ & ::std::ios_base::out && pptr()) - return static_cast(pend() - pbase()); - else if(mode_ & ::std::ios_base::in && gptr()) - return static_cast(egptr() - eback()); - else - return 0; - } - - template - typename std::basic_string::size_type - basic_altstringbuf:: - cur_size () const { - if(mode_ & ::std::ios_base::out && pptr()) - return static_cast( pptr() - pbase()); - else if(mode_ & ::std::ios_base::in && gptr()) - return static_cast( gptr() - eback()); - else - return 0; - } - - template - typename basic_altstringbuf::pos_type - basic_altstringbuf:: - seekoff (off_type off, ::std::ios_base::seekdir way, ::std::ios_base::openmode which) { - if(pptr() != NULL && putend_ < pptr()) - putend_ = pptr(); - if(which & ::std::ios_base::in && gptr() != NULL) { - // get area - if(way == ::std::ios_base::end) - off += static_cast(putend_ - gptr()); - else if(way == ::std::ios_base::beg) - off += static_cast(eback() - gptr()); - else if(way != ::std::ios_base::cur || (which & ::std::ios_base::out) ) - // (altering in&out is only supported if way is beg or end, not cur) - return pos_type(off_type(-1)); - if(eback() <= off+gptr() && off+gptr() <= putend_ ) { - // set gptr - streambuf_t::gbump(static_cast(off)); - if(which & ::std::ios_base::out && pptr() != NULL) - // update pptr to match gptr - streambuf_t::pbump(static_cast(gptr()-pptr())); - } - else - off = off_type(-1); - } - else if(which & ::std::ios_base::out && pptr() != NULL) { - // put area - if(way == ::std::ios_base::end) - off += static_cast(putend_ - pptr()); - else if(way == ::std::ios_base::beg) - off += static_cast(pbase() - pptr()); - else if(way != ::std::ios_base::beg) - return pos_type(off_type(-1)); - if(pbase() <= off+pptr() && off+pptr() <= putend_) - // set pptr - streambuf_t::pbump(static_cast(off)); - else - off = off_type(-1); - } - else // neither in nor out - off = off_type(-1); - return (pos_type(off)); - } - //- end seekoff(..) - - - template - typename basic_altstringbuf::pos_type - basic_altstringbuf:: - seekpos (pos_type pos, ::std::ios_base::openmode which) { - off_type off = off_type(pos); // operation guaranteed by 27.4.3.2 table 88 - if(pptr() != NULL && putend_ < pptr()) - putend_ = pptr(); - if(off != off_type(-1)) { - if(which & ::std::ios_base::in && gptr() != NULL) { - // get area - if(0 <= off && off <= putend_ - eback()) { - streambuf_t::gbump(static_cast(eback() - gptr() + off)); - if(which & ::std::ios_base::out && pptr() != NULL) { - // update pptr to match gptr - streambuf_t::pbump(static_cast(gptr()-pptr())); - } - } - else - off = off_type(-1); - } - else if(which & ::std::ios_base::out && pptr() != NULL) { - // put area - if(0 <= off && off <= putend_ - eback()) - streambuf_t::pbump(static_cast(eback() - pptr() + off)); - else - off = off_type(-1); - } - else // neither in nor out - off = off_type(-1); - return (pos_type(off)); - } - else { - BOOST_ASSERT(0); // 27.4.3.2 allows undefined-behaviour here - return pos_type(off_type(-1)); - } - } - // -end seekpos(..) - - - template - typename basic_altstringbuf::int_type - basic_altstringbuf:: - underflow () { - if(gptr() == NULL) // no get area -> nothing to get. - return (compat_traits_type::eof()); - else if(gptr() < egptr()) // ok, in buffer - return (compat_traits_type::to_int_type(*gptr())); - else if(mode_ & ::std::ios_base::in && pptr() != NULL - && (gptr() < pptr() || gptr() < putend_) ) - { // expand get area - if(putend_ < pptr()) - putend_ = pptr(); // remember pptr reached this far - streambuf_t::setg(eback(), gptr(), putend_); - return (compat_traits_type::to_int_type(*gptr())); - } - else // couldnt get anything. EOF. - return (compat_traits_type::eof()); - } - // -end underflow(..) - - - template - typename basic_altstringbuf::int_type - basic_altstringbuf:: - pbackfail (int_type meta) { - if(gptr() != NULL && (eback() < gptr()) - && (mode_ & (::std::ios_base::out) - || compat_traits_type::eq_int_type(compat_traits_type::eof(), meta) - || compat_traits_type::eq(compat_traits_type::to_char_type(meta), gptr()[-1]) ) ) { - streambuf_t::gbump(-1); // back one character - if(!compat_traits_type::eq_int_type(compat_traits_type::eof(), meta)) - // put-back meta into get area - *gptr() = compat_traits_type::to_char_type(meta); - return (compat_traits_type::not_eof(meta)); - } - else - return (compat_traits_type::eof()); // failed putback - } - // -end pbackfail(..) - - - template - typename basic_altstringbuf::int_type - basic_altstringbuf:: - overflow (int_type meta) { -#ifdef BOOST_MSVC -#pragma warning(push) -#pragma warning(disable:4996) -#endif - if(compat_traits_type::eq_int_type(compat_traits_type::eof(), meta)) - return compat_traits_type::not_eof(meta); // nothing to do - else if(pptr() != NULL && pptr() < epptr()) { - streambuf_t::sputc(compat_traits_type::to_char_type(meta)); - return meta; - } - else if(! (mode_ & ::std::ios_base::out)) - // no write position, and cant make one - return compat_traits_type::eof(); - else { // make a write position available - std::size_t prev_size = pptr() == NULL ? 0 : epptr() - eback(); - std::size_t new_size = prev_size; - // exponential growth : size *= 1.5 - std::size_t add_size = new_size / 2; - if(add_size < alloc_min) - add_size = alloc_min; - Ch * newptr = NULL, *oldptr = eback(); - - // make sure adding add_size wont overflow size_t - while (0 < add_size && ((std::numeric_limits::max)() - - add_size < new_size) ) - add_size /= 2; - if(0 < add_size) { - new_size += add_size; -#ifdef _RWSTD_NO_CLASS_PARTIAL_SPEC - void *vdptr = alloc_.allocate(new_size, is_allocated_? oldptr : 0); - newptr = static_cast(vdptr); -#else - newptr = alloc_.allocate(new_size, is_allocated_? oldptr : 0); -#endif - } - - if(0 < prev_size) - compat_traits_type::copy(newptr, oldptr, prev_size); - if(is_allocated_) - alloc_.deallocate(oldptr, prev_size); - is_allocated_=true; - - if(prev_size == 0) { // first allocation - putend_ = newptr; - streambuf_t::setp(newptr, newptr + new_size); - if(mode_ & ::std::ios_base::in) - streambuf_t::setg(newptr, newptr, newptr + 1); - else - streambuf_t::setg(newptr, 0, newptr); - } - else { // update pointers - putend_ = putend_ - oldptr + newptr; - int pptr_count = static_cast(pptr()-pbase()); - int gptr_count = static_cast(gptr()-eback()); - streambuf_t::setp(pbase() - oldptr + newptr, newptr + new_size); - streambuf_t::pbump(pptr_count); - if(mode_ & ::std::ios_base::in) - streambuf_t::setg(newptr, newptr + gptr_count, pptr() + 1); - else - streambuf_t::setg(newptr, 0, newptr); - } - streambuf_t::sputc(compat_traits_type::to_char_type(meta)); - return meta; - } -#ifdef BOOST_MSVC -#pragma warning(pop) -#endif - } - // -end overflow(..) - - template - void basic_altstringbuf:: dealloc() { - if(is_allocated_) - alloc_.deallocate(eback(), (pptr() != NULL ? epptr() : egptr()) - eback()); - is_allocated_ = false; - streambuf_t::setg(0, 0, 0); - streambuf_t::setp(0, 0); - putend_ = NULL; - } - - }// N.S. io -} // N.S. boost - -#endif // include guard - diff --git a/3rdparty/boost/boost/format/detail/compat_workarounds.hpp b/3rdparty/boost/boost/format/detail/compat_workarounds.hpp deleted file mode 100644 index 8e51514f3e..0000000000 --- a/3rdparty/boost/boost/format/detail/compat_workarounds.hpp +++ /dev/null @@ -1,86 +0,0 @@ -// ---------------------------------------------------------------------------- -// compat_workarounds : general framework for non-conformance workarounds -// ---------------------------------------------------------------------------- - -// Copyright Samuel Krempp 2003. Use, modification, and distribution are -// subject to the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// see http://www.boost.org/libs/format for library home page - -// ---------------------------------------------------------------------------- - - -// this file defines wrapper classes to hide non-conforming -// std::char_traits<> and std::allocator<> traits -// and Includes : config_macros.hpp (defines config macros -// and compiler-specific switches) - -// Non-conformant Std-libs fail to supply conformant traits (std::char_traits, -// std::allocator) and/or the std::string doesnt support them. -// We don't want to have hundreds of #ifdef workarounds, so we define -// replacement traits. -// But both char_traits and allocator traits are visible in the interface, -// (inside the final string type), thus we need to keep both -// the replacement type (typedefed to 'compatible_type') for real use, -// and the original stdlib type (typedef to 'type_for_string') for interface -// visibility. This is what Compat* classes do (as well as be transparent -// when good allocator and char traits are present) - -#ifndef BOOST_FORMAT_COMPAT_WORKAROUNDS_HPP -#define BOOST_FORMAT_COMPAT_WORKAROUNDS_HPP - -namespace boost { - namespace io { - - // gcc-2.95 char traits (non-conformantly named string_char_traits) - // lack several functions so we extend them in a replacement class. - template - class CompatTraits; - - // std::allocator in gcc-2.95 is ok, but basic_string only works - // with plain 'std::alloc' still, alt_stringbuf requires a functionnal - // alloc template argument, so we need a replacement allocator - template - class CompatAlloc; - } // N.S. io -}// N.S. boost - - -#include - // sets-up macros and load compiler-specific workarounds headers. - -#if !defined(BOOST_FORMAT_STREAMBUF_DEFINED) -// workarounds-gcc-2.95 might have defined own streambuf -#include -#endif - -#if !defined(BOOST_FORMAT_OSTREAM_DEFINED) -// workarounds-gcc-2.95 might already have included -#include -#endif - - - -namespace boost { - namespace io { - - // **** CompatTraits general definitions : ---------------------------- - template - class CompatTraits - { // general case : be transparent - public: - typedef Tr compatible_type; - }; - - // **** CompatAlloc general definitions : ----------------------------- - template - class CompatAlloc - { // general case : be transparent - public: - typedef Alloc compatible_type; - }; - - } //N.S. io -} // N.S. boost -#endif // include guard diff --git a/3rdparty/boost/boost/format/detail/config_macros.hpp b/3rdparty/boost/boost/format/detail/config_macros.hpp deleted file mode 100644 index 44d1e86c63..0000000000 --- a/3rdparty/boost/boost/format/detail/config_macros.hpp +++ /dev/null @@ -1,95 +0,0 @@ -// -*- C++ -*- -// ---------------------------------------------------------------------------- -// config_macros.hpp : configuration macros for the format library -// only BOOST_IO_STD is absolutely needed (it should be 'std::' in general) -// others are compiler-specific workaround macros used in #ifdef switches -// ---------------------------------------------------------------------------- - -// Copyright Samuel Krempp 2003. Use, modification, and distribution are -// subject to the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// see http://www.boost.org/libs/format for library home page - - -// ---------------------------------------------------------------------------- - -#ifndef BOOST_FORMAT_CONFIG_MACROS_HPP -#define BOOST_FORMAT_CONFIG_MACROS_HPP - -#include -#include - -// make sure our local macros wont override something : -#if defined(BOOST_NO_LOCALE_ISDIGIT) || defined(BOOST_OVERLOAD_FOR_NON_CONST) \ - || defined(BOOST_IO_STD) || defined( BOOST_IO_NEEDS_USING_DECLARATION ) \ - || defined(BOOST_NO_TEMPLATE_STD_STREAM) \ - || defined(BOOST_FORMAT_STREAMBUF_DEFINED) || defined(BOOST_FORMAT_OSTREAM_DEFINED) -#error "boost::format uses a local macro that is already defined." -#endif - -// specific workarounds. each header can define BOOS_IO_STD if it -// needs. (e.g. because of IO_NEEDS_USING_DECLARATION) -#include -#include - -#ifndef BOOST_IO_STD -# define BOOST_IO_STD ::std:: -#endif - -#if defined(BOOST_NO_STD_LOCALE) || \ - ( BOOST_WORKAROUND(__BORLANDC__, <= 0x564) \ - || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT( 0x570 ) ) ) -// some future __BORLANDC__ >0x564 versions might not need this -// 0x570 is Borland's kylix branch -#define BOOST_NO_LOCALE_ISDIGIT -#endif - -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x570) ) || BOOST_WORKAROUND( BOOST_MSVC, BOOST_TESTED_AT(1300)) -#define BOOST_NO_OVERLOAD_FOR_NON_CONST -#endif - -// **** Workaround for io streams, stlport and msvc. -#ifdef BOOST_IO_NEEDS_USING_DECLARATION -namespace boost { - using std::char_traits; - using std::basic_ostream; - namespace io { - using std::basic_ostream; - namespace detail { - using std::basic_ios; - using std::basic_ostream; - } - } -#if ! defined(BOOST_NO_STD_LOCALE) - using std::locale; - namespace io { - using std::locale; - namespace detail { - using std::locale; - } - } -#endif // locale -} - // -end N.S. boost -#endif // needs_using_declaration - -#if ! defined(BOOST_NO_STD_LOCALE) -#include -#endif - - -// *** hide std::locale if it doesnt exist. -// this typedef is either std::locale or int, avoids placing ifdefs everywhere -namespace boost { namespace io { namespace detail { -#if ! defined(BOOST_NO_STD_LOCALE) - typedef BOOST_IO_STD locale locale_t; -#else - typedef int locale_t; -#endif -} } } - - -// ---------------------------------------------------------------------------- - -#endif // BOOST_FORMAT_MACROS_DEFAULT_HPP diff --git a/3rdparty/boost/boost/format/detail/msvc_disambiguater.hpp b/3rdparty/boost/boost/format/detail/msvc_disambiguater.hpp deleted file mode 100644 index c2692c4435..0000000000 --- a/3rdparty/boost/boost/format/detail/msvc_disambiguater.hpp +++ /dev/null @@ -1,54 +0,0 @@ -// ---------------------------------------------------------------------------- -// msvc_disambiguater.hpp : msvc workarounds. (for put_{head|last} overloads) -// the trick was described in boost's list by Aleksey Gurtovoy -// ---------------------------------------------------------------------------- - -// Copyright Samuel Krempp 2003. Use, modification, and distribution are -// subject to the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// see http://www.boost.org/libs/format for library home page - -// ---------------------------------------------------------------------------- - -#ifndef BOOST_MSVC_DISAMBIGUATER_HPP -#define BOOST_MSVC_DISAMBIGUATER_HPP - -#if BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(60590042)) - -#include -#include - -namespace boost { -namespace io { -namespace detail { - -template< class Ch, class Tr, class T > -struct disambiguater -{ - template< typename U > - static void put_head(BOOST_IO_STD basic_ostream& os, group1 const& x, long) - { - os << group_head(x.a1_); - } - static void put_head(BOOST_IO_STD basic_ostream& os, T const& x, int) - { - } - template< typename U > - static void put_last(BOOST_IO_STD basic_ostream& os, group1 const& x, long) - { - os << group_last(x.a1_); - } - static void put_last(BOOST_IO_STD basic_ostream& os, T const& x, int) - { - os << x; - } -}; - -} // namespace detail -} // namespace io -} // namespace boost - -#endif // -__DECCXX_VER - -#endif // -BOOST_MSVC_DISAMBIGUATER_HPP diff --git a/3rdparty/boost/boost/format/detail/unset_macros.hpp b/3rdparty/boost/boost/format/detail/unset_macros.hpp deleted file mode 100644 index b3ac47b42b..0000000000 --- a/3rdparty/boost/boost/format/detail/unset_macros.hpp +++ /dev/null @@ -1,34 +0,0 @@ -// ---------------------------------------------------------------------------- -// unset_macros.hpp -// ---------------------------------------------------------------------------- - -// Copyright Samuel Krempp 2003. Use, modification, and distribution are -// subject to the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org/libs/format for library home page - -// ---------------------------------------------------------------------------- - -// *** Undefine 'local' macros : -#ifdef BOOST_NO_OVERLOAD_FOR_NON_CONST -#undef BOOST_NO_OVERLOAD_FOR_NON_CONST -#endif -#ifdef BOOST_NO_LOCALE_ISDIGIT -#undef BOOST_NO_LOCALE_ISDIGIT -#endif -#ifdef BOOST_IO_STD -#undef BOOST_IO_STD -#endif -#ifdef BOOST_IO_NEEDS_USING_DECLARATION -#undef BOOST_IO_NEEDS_USING_DECLARATION -#endif -#ifdef BOOST_NO_TEMPLATE_STD_STREAM -#undef BOOST_NO_TEMPLATE_STD_STREAM -#endif -#ifdef BOOST_FORMAT_STREAMBUF_DEFINED -#undef BOOST_FORMAT_STREAMBUF_DEFINED -#endif -#ifdef BOOST_FORMAT_OSTREAM_DEFINED -#undef BOOST_FORMAT_OSTREAM_DEFINED -#endif diff --git a/3rdparty/boost/boost/format/detail/workarounds_gcc-2_95.hpp b/3rdparty/boost/boost/format/detail/workarounds_gcc-2_95.hpp deleted file mode 100644 index 8c49d42d02..0000000000 --- a/3rdparty/boost/boost/format/detail/workarounds_gcc-2_95.hpp +++ /dev/null @@ -1,162 +0,0 @@ -// ---------------------------------------------------------------------------- -// workarounds for gcc < 3.0. -// ---------------------------------------------------------------------------- - -// Copyright Samuel Krempp 2003. Use, modification, and distribution are -// subject to the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org/libs/format for library home page - - -// ---------------------------------------------------------------------------- - -// There's a lot to do, the stdlib shipped with gcc prior to 3.x -// was terribly non-conforming. -// . defines macros switches -// . supplies template classes basic_foo where gcc only supplies foo. -// i.e : -// - basic_ios from ios -// - basic_ostream from ostream -// - basic_srteambuf from streambuf -// these can be used transparently. (it obviously does not work for wchar_t) -// . specialise CompatAlloc and CompatTraits to wrap gcc-2.95's -// string_char_traits and std::alloc - -#if BOOST_WORKAROUND(__GNUC__, < 3) && !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION) - // only for gcc-2.95's native stdlib - -#ifndef BOOST_FORMAT_WORKAROUNDS_GCC295_H -#define BOOST_FORMAT_WORKAROUNDS_GCC295_H - -// SGI STL doesnt have and others, so we need iostream. -#include -#define BOOST_FORMAT_OSTREAM_DEFINED - -#include -#define BOOST_FORMAT_STREAMBUF_DEFINED - -#define BOOST_NO_TEMPLATE_STD_STREAM - -#ifndef BOOST_IO_STD -# define BOOST_IO_STD std:: -#endif - - - -// *** -// gcc's simple classes turned into standard-like template classes : - -namespace std { - - - // gcc has string_char_traits, it's incomplete. - // we declare a std::char_traits, and specialize CompatTraits<..> on it - // to do what is required - template - class char_traits; // no definition here, we will just use it as a tag. - - template - class basic_streambuf; - - template - class basic_streambuf : public streambuf { - }; - - template > - class basic_ios; - - template - class basic_ios : public ostream { - public: - basic_ios(streambuf * p) : ostream(p) {}; - char fill() const { return ios::fill(); } // gcc returns wchar.. - char fill(char c) { return ios::fill(c); } // gcc takes wchar.. - char widen(char c) { return c; } - char narrow(char c, char def) { return c; } - basic_ios& copyfmt(const ios& right) { - fill(right.fill()); - flags(right.flags() ); - exceptions(right.exceptions()); - width(right.width()); - precision(right.precision()); - return *this; - } - }; - - - typedef ios ios_base; - - template - class basic_ostream; - - template - class basic_ostream : public basic_ios - { - public: - basic_ostream(streambuf * p) : basic_ios (p) {} - }; - -} // namespace std - - -namespace boost { - namespace io { - - - // ** CompatTraits gcc2.95 specialisations ---------------------------- - template - class CompatTraits< ::std::string_char_traits > - : public ::std::string_char_traits - { - public: - typedef CompatTraits compatible_type; - - typedef Ch char_type; - typedef int int_type; - typedef ::std::streampos pos_type; - typedef ::std::streamoff off_type; - - static char_type - to_char_type(const int_type& meta) { - return static_cast(meta); } - static int_type - to_int_type(const char_type& ch) { - return static_cast(static_cast(ch) );} - static bool - eq_int_type(const int_type& left, const int_type& right) { - return left == right; } - static int_type - eof() { - return static_cast(EOF); - } - static int_type - not_eof(const int_type& meta) { - return (meta == eof()) ? 0 : meta; - } - }; - - template - class CompatTraits< ::std::char_traits > { - public: - typedef CompatTraits< ::std::string_char_traits > compatible_type; - }; - - // ** CompatAlloc gcc-2.95 specialisations --------------------------- - template<> - class CompatAlloc< ::std::alloc> - { - public: - typedef ::std::allocator compatible_type; - }; - - } // N.S. io -} // N.S. boost - - - - - -#endif // include guard - -#endif // if workaround diff --git a/3rdparty/boost/boost/format/detail/workarounds_stlport.hpp b/3rdparty/boost/boost/format/detail/workarounds_stlport.hpp deleted file mode 100644 index 5d435b98a0..0000000000 --- a/3rdparty/boost/boost/format/detail/workarounds_stlport.hpp +++ /dev/null @@ -1,36 +0,0 @@ -// ---------------------------------------------------------------------------- -// workarounds_stlport.hpp : workaround STLport issues -// ---------------------------------------------------------------------------- - -// Copyright Samuel Krempp 2003. Use, modification, and distribution are -// subject to the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// see http://www.boost.org/libs/format for library home page - -// ---------------------------------------------------------------------------- - -#ifndef BOOST_MACROS_STLPORT_HPP -#define BOOST_MACROS_STLPORT_HPP - -// *** This should go to "boost/config/stdlib/stlport.hpp". - -// If the streams are not native and there are problems with using templates -// accross namespaces, we define some macros to enable a workaround for this. - -// STLport 4.5 -#if !defined(_STLP_OWN_IOSTREAMS) && defined(_STLP_USE_NAMESPACES) && defined(BOOST_NO_USING_TEMPLATE) -# define BOOST_IO_STD -# define BOOST_IO_NEEDS_USING_DECLARATION -#endif - -// STLport 4.0 -#if !defined(__SGI_STL_OWN_IOSTREAMS) && defined(__STL_USE_OWN_NAMESPACE) && defined(BOOST_NO_USING_TEMPLATE) -# define BOOST_IO_STD -# define BOOST_IO_NEEDS_USING_DECLARATION -#endif - - -// ---------------------------------------------------------------------------- - -#endif // BOOST_MACROS_STLPORT_HPP diff --git a/3rdparty/boost/boost/format/exceptions.hpp b/3rdparty/boost/boost/format/exceptions.hpp deleted file mode 100644 index 56ee30dce0..0000000000 --- a/3rdparty/boost/boost/format/exceptions.hpp +++ /dev/null @@ -1,103 +0,0 @@ -// ---------------------------------------------------------------------------- -// boost/format/exceptions.hpp -// ---------------------------------------------------------------------------- - -// Copyright Samuel Krempp 2003. -// -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// -// See http://www.boost.org/libs/format/ for library home page - -// ---------------------------------------------------------------------------- - -#ifndef BOOST_FORMAT_EXCEPTIONS_HPP -#define BOOST_FORMAT_EXCEPTIONS_HPP - - -#include - - -namespace boost { - - namespace io { - -// **** exceptions ----------------------------------------------- - - class format_error : public std::exception - { - public: - format_error() {} - virtual const char *what() const throw() { - return "boost::format_error: " - "format generic failure"; - } - }; - - class bad_format_string : public format_error - { - std::size_t pos_, next_; - public: - bad_format_string(std::size_t pos, std::size_t size) - : pos_(pos), next_(size) {} - std::size_t get_pos() const { return pos_; } - std::size_t get_next() const { return next_; } - virtual const char *what() const throw() { - return "boost::bad_format_string: format-string is ill-formed"; - } - }; - - class too_few_args : public format_error - { - std::size_t cur_, expected_; - public: - too_few_args(std::size_t cur, std::size_t expected) - : cur_(cur), expected_(expected) {} - std::size_t get_cur() const { return cur_; } - std::size_t get_expected() const { return expected_; } - virtual const char *what() const throw() { - return "boost::too_few_args: " - "format-string referred to more arguments than were passed"; - } - }; - - class too_many_args : public format_error - { - std::size_t cur_, expected_; - public: - too_many_args(std::size_t cur, std::size_t expected) - : cur_(cur), expected_(expected) {} - std::size_t get_cur() const { return cur_; } - std::size_t get_expected() const { return expected_; } - virtual const char *what() const throw() { - return "boost::too_many_args: " - "format-string referred to fewer arguments than were passed"; - } - }; - - - class out_of_range : public format_error - { - int index_, beg_, end_; // range is [ beg, end [ - public: - out_of_range(int index, int beg, int end) - : index_(index), beg_(beg), end_(end) {} - int get_index() const { return index_; } - int get_beg() const { return beg_; } - int get_end() const { return end_; } - virtual const char *what() const throw() { - return "boost::out_of_range: " - "tried to refer to an argument (or item) number which" - " is out of range, according to the format string"; - } - }; - - - } // namespace io - -} // namespace boost - - -#endif // BOOST_FORMAT_EXCEPTIONS_HPP diff --git a/3rdparty/boost/boost/format/feed_args.hpp b/3rdparty/boost/boost/format/feed_args.hpp deleted file mode 100644 index fa45d215d8..0000000000 --- a/3rdparty/boost/boost/format/feed_args.hpp +++ /dev/null @@ -1,319 +0,0 @@ -// ---------------------------------------------------------------------------- -// feed_args.hpp : functions for processing each argument -// (feed, feed_manip, and distribute) -// ---------------------------------------------------------------------------- - -// Copyright Samuel Krempp 2003. Use, modification, and distribution are -// subject to the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org/libs/format for library home page - -// ---------------------------------------------------------------------------- - -#ifndef BOOST_FORMAT_FEED_ARGS_HPP -#define BOOST_FORMAT_FEED_ARGS_HPP - -#include -#include -#include - -#include -#include -#include - -namespace boost { -namespace io { -namespace detail { - - template - void mk_str( std::basic_string & res, - const Ch * beg, - typename std::basic_string::size_type size, - std::streamsize w, - const Ch fill_char, - std::ios_base::fmtflags f, - const Ch prefix_space, // 0 if no space-padding - bool center) - // applies centered/left/right padding to the string [beg, beg+size[ - // Effects : the result is placed in res. - { - typedef typename std::basic_string::size_type size_type; - res.resize(0); - if(w<=0 || static_cast(w) <=size) { - // no need to pad. - res.reserve(size + !!prefix_space); - if(prefix_space) - res.append(1, prefix_space); - if (size) - res.append(beg, size); - } - else { - std::streamsize n=static_cast(w-size-!!prefix_space); - std::streamsize n_after = 0, n_before = 0; - res.reserve(static_cast(w)); // allocate once for the 2 inserts - if(center) - n_after = n/2, n_before = n - n_after; - else - if(f & std::ios_base::left) - n_after = n; - else - n_before = n; - // now make the res string : - if(n_before) res.append(static_cast(n_before), fill_char); - if(prefix_space) - res.append(1, prefix_space); - if (size) - res.append(beg, size); - if(n_after) res.append(static_cast(n_after), fill_char); - } - } // -mk_str(..) - - -#if BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(60590042)) -// __DECCXX needs to be tricked to disambiguate this simple overload.. -// the trick is in "boost/format/msvc_disambiguater.hpp" - - template< class Ch, class Tr, class T> inline - void put_head (BOOST_IO_STD basic_ostream & os, const T& x ) { - disambiguater::put_head(os, x, 1L); - } - template< class Ch, class Tr, class T> inline - void put_last (BOOST_IO_STD basic_ostream & os, const T& x ) { - disambiguater::put_last(os, x, 1L); - } - -#else - - template< class Ch, class Tr, class T> inline - void put_head (BOOST_IO_STD basic_ostream &, const T& ) { - } - - template< class Ch, class Tr, class T> inline - void put_head( BOOST_IO_STD basic_ostream & os, const group1& x ) { - os << group_head(x.a1_); // send the first N-1 items, not the last - } - - template< class Ch, class Tr, class T> inline - void put_last( BOOST_IO_STD basic_ostream & os, const T& x ) { - os << x ; - } - - template< class Ch, class Tr, class T> inline - void put_last( BOOST_IO_STD basic_ostream & os, const group1& x ) { - os << group_last(x.a1_); // this selects the last element - } - -#ifndef BOOST_NO_OVERLOAD_FOR_NON_CONST - template< class Ch, class Tr, class T> inline - void put_head( BOOST_IO_STD basic_ostream &, T& ) { - } - - template< class Ch, class Tr, class T> inline - void put_last( BOOST_IO_STD basic_ostream & os, T& x) { - os << x ; - } -#endif -#endif // -__DECCXX workaround - - template< class Ch, class Tr, class T> - void call_put_head(BOOST_IO_STD basic_ostream & os, const void* x) { - put_head(os, *(typename ::boost::remove_reference::type*)x); - } - - template< class Ch, class Tr, class T> - void call_put_last(BOOST_IO_STD basic_ostream & os, const void* x) { - put_last(os, *(T*)x); - } - - template< class Ch, class Tr> - struct put_holder { - template - put_holder(T& t) - : arg(&t), - put_head(&call_put_head), - put_last(&call_put_last) - {} - const void* arg; - void (*put_head)(BOOST_IO_STD basic_ostream & os, const void* x); - void (*put_last)(BOOST_IO_STD basic_ostream & os, const void* x); - }; - - template< class Ch, class Tr> inline - void put_head( BOOST_IO_STD basic_ostream & os, const put_holder& t) { - t.put_head(os, t.arg); - } - - template< class Ch, class Tr> inline - void put_last( BOOST_IO_STD basic_ostream & os, const put_holder& t) { - t.put_last(os, t.arg); - } - - - template< class Ch, class Tr, class Alloc, class T> - void put( T x, - const format_item& specs, - typename basic_format::string_type& res, - typename basic_format::internal_streambuf_t & buf, - io::detail::locale_t *loc_p = NULL) - { -#ifdef BOOST_MSVC - // If std::min or std::max are already instantiated - // at this point then we get a blizzard of warning messages when we call - // those templates with std::size_t as arguments. Weird and very annoyning... -#pragma warning(push) -#pragma warning(disable:4267) -#endif - // does the actual conversion of x, with given params, into a string - // using the supplied stringbuf. - - typedef typename basic_format::string_type string_type; - typedef typename basic_format::format_item_t format_item_t; - typedef typename string_type::size_type size_type; - - basic_oaltstringstream oss( &buf); - - if(loc_p != NULL) - oss.imbue(*loc_p); - - specs.fmtstate_.apply_on(oss, loc_p); - - // the stream format state can be modified by manipulators in the argument : - put_head( oss, x ); - // in case x is a group, apply the manip part of it, - // in order to find width - - const std::ios_base::fmtflags fl=oss.flags(); - const bool internal = (fl & std::ios_base::internal) != 0; - const std::streamsize w = oss.width(); - const bool two_stepped_padding= internal && (w!=0); - - res.resize(0); - if(! two_stepped_padding) { - if(w>0) // handle padding via mk_str, not natively in stream - oss.width(0); - put_last( oss, x); - const Ch * res_beg = buf.pbase(); - Ch prefix_space = 0; - if(specs.pad_scheme_ & format_item_t::spacepad) - if(buf.pcount()== 0 || - (res_beg[0] !=oss.widen('+') && res_beg[0] !=oss.widen('-') )) - prefix_space = oss.widen(' '); - size_type res_size = (std::min)( - static_cast(specs.truncate_ - !!prefix_space), - buf.pcount() ); - mk_str(res, res_beg, res_size, w, oss.fill(), fl, - prefix_space, (specs.pad_scheme_ & format_item_t::centered) !=0 ); - } - else { // 2-stepped padding - // internal can be implied by zeropad, or user-set. - // left, right, and centered alignment overrule internal, - // but spacepad or truncate might be mixed with internal (using manipulator) - put_last( oss, x); // may pad - const Ch * res_beg = buf.pbase(); - size_type res_size = buf.pcount(); - bool prefix_space=false; - if(specs.pad_scheme_ & format_item_t::spacepad) - if(buf.pcount()== 0 || - (res_beg[0] !=oss.widen('+') && res_beg[0] !=oss.widen('-') )) - prefix_space = true; - if(res_size == static_cast(w) && w<=specs.truncate_ && !prefix_space) { - // okay, only one thing was printed and padded, so res is fine - res.assign(res_beg, res_size); - } - else { // length w exceeded - // either it was multi-output with first output padding up all width.. - // either it was one big arg and we are fine. - // Note that res_size oss2( &buf); - specs.fmtstate_.apply_on(oss2, loc_p); - put_head( oss2, x ); - - oss2.width(0); - if(prefix_space) - oss2 << ' '; - put_last(oss2, x ); - if(buf.pcount()==0 && specs.pad_scheme_ & format_item_t::spacepad) { - prefix_space =true; - oss2 << ' '; - } - // we now have the minimal-length output - const Ch * tmp_beg = buf.pbase(); - size_type tmp_size = (std::min)(static_cast(specs.truncate_), - buf.pcount() ); - - - if(static_cast(w) <= tmp_size) { - // minimal length is already >= w, so no padding (cool!) - res.assign(tmp_beg, tmp_size); - } - else { // hum.. we need to pad (multi_output, or spacepad present) - //find where we should pad - size_type sz = (std::min)(res_size + (prefix_space ? 1 : 0), tmp_size); - size_type i = prefix_space; - for(; i=tmp_size) i=prefix_space; - res.assign(tmp_beg, i); - std::streamsize d = w - static_cast(tmp_size); - BOOST_ASSERT(d>0); - res.append(static_cast( d ), oss2.fill()); - res.append(tmp_beg+i, tmp_size-i); - BOOST_ASSERT(i+(tmp_size-i)+(std::max)(d,(std::streamsize)0) - == static_cast(w)); - BOOST_ASSERT(res.size() == static_cast(w)); - } - } - } - buf.clear_buffer(); -#ifdef BOOST_MSVC -#pragma warning(pop) -#endif - } // end- put(..) - - - template< class Ch, class Tr, class Alloc, class T> - void distribute (basic_format& self, T x) { - // call put(x, ..) on every occurrence of the current argument : - if(self.cur_arg_ >= self.num_args_) { - if( self.exceptions() & too_many_args_bit ) - boost::throw_exception(too_many_args(self.cur_arg_, self.num_args_)); - else return; - } - for(unsigned long i=0; i < self.items_.size(); ++i) { - if(self.items_[i].argN_ == self.cur_arg_) { - put (x, self.items_[i], self.items_[i].res_, - self.buf_, boost::get_pointer(self.loc_) ); - } - } - } - - template - basic_format& - feed_impl (basic_format& self, T x) { - if(self.dumped_) self.clear(); - distribute (self, x); - ++self.cur_arg_; - if(self.bound_.size() != 0) { - while( self.cur_arg_ < self.num_args_ && self.bound_[self.cur_arg_] ) - ++self.cur_arg_; - } - return self; - } - - template inline - basic_format& - feed (basic_format& self, T x) { - return feed_impl&>(self, put_holder(x)); - } - -} // namespace detail -} // namespace io -} // namespace boost - - -#endif // BOOST_FORMAT_FEED_ARGS_HPP diff --git a/3rdparty/boost/boost/format/format_class.hpp b/3rdparty/boost/boost/format/format_class.hpp deleted file mode 100644 index 2ac59ef280..0000000000 --- a/3rdparty/boost/boost/format/format_class.hpp +++ /dev/null @@ -1,168 +0,0 @@ -// ---------------------------------------------------------------------------- -// format_class.hpp : class interface -// ---------------------------------------------------------------------------- - -// Copyright Samuel Krempp 2003. Use, modification, and distribution are -// subject to the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org/libs/format for library home page - -// ---------------------------------------------------------------------------- - -#ifndef BOOST_FORMAT_CLASS_HPP -#define BOOST_FORMAT_CLASS_HPP - - -#include -#include - -#include // to store locale when needed - -#include -#include -#include -#include - -namespace boost { - - template - class basic_format - { - typedef typename io::CompatTraits::compatible_type compat_traits; - public: - typedef Ch CharT; // borland fails in operator% if we use Ch and Tr directly - typedef std::basic_string string_type; - typedef typename string_type::size_type size_type; - typedef io::detail::format_item format_item_t; - typedef io::basic_altstringbuf internal_streambuf_t; - - - explicit basic_format(const Ch* str=NULL); - explicit basic_format(const string_type& s); - basic_format(const basic_format& x); - basic_format& operator= (const basic_format& x); - void swap(basic_format& x); - -#if !defined(BOOST_NO_STD_LOCALE) - explicit basic_format(const Ch* str, const std::locale & loc); - explicit basic_format(const string_type& s, const std::locale & loc); -#endif - io::detail::locale_t getloc() const; - - basic_format& clear(); // empty all converted string buffers (except bound items) - basic_format& clear_binds(); // unbind all bound items, and call clear() - basic_format& parse(const string_type&); // resets buffers and parse a new format string - - // ** formatted result ** // - size_type size() const; // sum of the current string pieces sizes - string_type str() const; // final string - - // ** arguments passing ** // - template - basic_format& operator%(const T& x) - { return io::detail::feed(*this,x); } - -#ifndef BOOST_NO_OVERLOAD_FOR_NON_CONST - template basic_format& operator%(T& x) - { return io::detail::feed(*this,x); } -#endif - -#if defined(__GNUC__) - // GCC can't handle anonymous enums without some help - // ** arguments passing ** // - basic_format& operator%(const int& x) - { return io::detail::feed(*this,x); } - -#ifndef BOOST_NO_OVERLOAD_FOR_NON_CONST - basic_format& operator%(int& x) - { return io::detail::feed(*this,x); } -#endif -#endif - - // The total number of arguments expected to be passed to the format objectt - int expected_args() const - { return num_args_; } - // The number of arguments currently bound (see bind_arg(..) ) - int bound_args() const; - // The number of arguments currently fed to the format object - int fed_args() const; - // The index (1-based) of the current argument (i.e. next to be formatted) - int cur_arg() const; - // The number of arguments still required to be fed - int remaining_args() const; // same as expected_args() - bound_args() - fed_args() - - - // ** object modifying **// - template - basic_format& bind_arg(int argN, const T& val) - { return io::detail::bind_arg_body(*this, argN, val); } - basic_format& clear_bind(int argN); - template - basic_format& modify_item(int itemN, T manipulator) - { return io::detail::modify_item_body (*this, itemN, manipulator);} - - // Choosing which errors will throw exceptions : - unsigned char exceptions() const; - unsigned char exceptions(unsigned char newexcept); - -#if !defined( BOOST_NO_MEMBER_TEMPLATE_FRIENDS ) \ - && !BOOST_WORKAROUND(__BORLANDC__, <= 0x570) \ - && !BOOST_WORKAROUND( _CRAYC, != 0) \ - && !BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(60590042)) - // use friend templates and private members only if supported - -#ifndef BOOST_NO_TEMPLATE_STD_STREAM - template - friend std::basic_ostream & - operator<<( std::basic_ostream & , - const basic_format& ); -#else - template - friend std::ostream & - operator<<( std::ostream & , - const basic_format& ); -#endif - - template - friend basic_format& - io::detail::feed_impl (basic_format&, T); - - template friend - void io::detail::distribute (basic_format&, T); - - template friend - basic_format& - io::detail::modify_item_body (basic_format&, int, T); - - template friend - basic_format& - io::detail::bind_arg_body (basic_format&, int, const T&); - - private: -#endif - typedef io::detail::stream_format_state stream_format_state; - // flag bits, used for style_ - enum style_values { ordered = 1, // set only if all directives are positional - special_needs = 4 }; - - void make_or_reuse_data(std::size_t nbitems);// used for (re-)initialisation - - // member data --------------------------------------------// - std::vector items_; // each '%..' directive leads to a format_item - std::vector bound_; // stores which arguments were bound. size() == 0 || num_args - - int style_; // style of format-string : positional or not, etc - int cur_arg_; // keep track of wich argument is current - int num_args_; // number of expected arguments - mutable bool dumped_; // true only after call to str() or << - string_type prefix_; // piece of string to insert before first item - unsigned char exceptions_; - internal_streambuf_t buf_; // the internal stream buffer. - boost::optional loc_; - }; // class basic_format - -} // namespace boost - - -#endif // BOOST_FORMAT_CLASS_HPP diff --git a/3rdparty/boost/boost/format/format_fwd.hpp b/3rdparty/boost/boost/format/format_fwd.hpp deleted file mode 100644 index 16b8565468..0000000000 --- a/3rdparty/boost/boost/format/format_fwd.hpp +++ /dev/null @@ -1,43 +0,0 @@ -// ---------------------------------------------------------------------------- -// format_fwd.hpp : forward declarations -// ---------------------------------------------------------------------------- - -// Copyright Samuel Krempp 2003. Use, modification, and distribution are -// subject to the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org/libs/format for library home page - -// ---------------------------------------------------------------------------- - -#ifndef BOOST_FORMAT_FWD_HPP -#define BOOST_FORMAT_FWD_HPP - -#include -#include - -#include - -namespace boost { - - template , class Alloc = std::allocator > - class basic_format; - - typedef basic_format format; - -#if !defined(BOOST_NO_STD_WSTRING) && !defined(BOOST_NO_STD_WSTREAMBUF) - typedef basic_format wformat; -#endif - - namespace io { - enum format_error_bits { bad_format_string_bit = 1, - too_few_args_bit = 2, too_many_args_bit = 4, - out_of_range_bit = 8, - all_error_bits = 255, no_error_bits=0 }; - - } // namespace io - -} // namespace boost - -#endif // BOOST_FORMAT_FWD_HPP diff --git a/3rdparty/boost/boost/format/format_implementation.hpp b/3rdparty/boost/boost/format/format_implementation.hpp deleted file mode 100644 index 2abb5c4b03..0000000000 --- a/3rdparty/boost/boost/format/format_implementation.hpp +++ /dev/null @@ -1,329 +0,0 @@ -// ---------------------------------------------------------------------------- -// format_implementation.hpp Implementation of the basic_format class -// ---------------------------------------------------------------------------- - -// Copyright Samuel Krempp 2003. Use, modification, and distribution are -// subject to the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org/libs/format for library home page - - -// ---------------------------------------------------------------------------- - -#ifndef BOOST_FORMAT_IMPLEMENTATION_HPP -#define BOOST_FORMAT_IMPLEMENTATION_HPP - -#include -#include -#include -#include -#include // std::swap - -namespace boost { - -// --- basic_format implementation -----------------------------------------// - - template< class Ch, class Tr, class Alloc> - basic_format:: basic_format(const Ch* s) - : style_(0), cur_arg_(0), num_args_(0), dumped_(false), - exceptions_(io::all_error_bits) - { - if( s) - parse( s ); - } - -#if !defined(BOOST_NO_STD_LOCALE) - template< class Ch, class Tr, class Alloc> - basic_format:: basic_format(const Ch* s, const std::locale & loc) - : style_(0), cur_arg_(0), num_args_(0), dumped_(false), - exceptions_(io::all_error_bits), loc_(loc) - { - if(s) parse( s ); - } - - template< class Ch, class Tr, class Alloc> - basic_format:: basic_format(const string_type& s, const std::locale & loc) - : style_(0), cur_arg_(0), num_args_(0), dumped_(false), - exceptions_(io::all_error_bits), loc_(loc) - { - parse(s); - } -#endif // ! BOOST_NO_STD_LOCALE - template< class Ch, class Tr, class Alloc> - io::detail::locale_t basic_format:: - getloc() const { - return loc_ ? loc_.get() : io::detail::locale_t(); - } - - template< class Ch, class Tr, class Alloc> - basic_format:: basic_format(const string_type& s) - : style_(0), cur_arg_(0), num_args_(0), dumped_(false), - exceptions_(io::all_error_bits) - { - parse(s); - } - - template< class Ch, class Tr, class Alloc> // just don't copy the buf_ member - basic_format:: basic_format(const basic_format& x) - : items_(x.items_), bound_(x.bound_), style_(x.style_), - cur_arg_(x.cur_arg_), num_args_(x.num_args_), dumped_(x.dumped_), - prefix_(x.prefix_), exceptions_(x.exceptions_), loc_(x.loc_) - { - } - - template< class Ch, class Tr, class Alloc> // just don't copy the buf_ member - basic_format& basic_format:: - operator= (const basic_format& x) { - if(this == &x) - return *this; - (basic_format(x)).swap(*this); - return *this; - } - template< class Ch, class Tr, class Alloc> - void basic_format:: - swap (basic_format & x) { - std::swap(exceptions_, x.exceptions_); - std::swap(style_, x.style_); - std::swap(cur_arg_, x.cur_arg_); - std::swap(num_args_, x.num_args_); - std::swap(dumped_, x.dumped_); - - items_.swap(x.items_); - prefix_.swap(x.prefix_); - bound_.swap(x.bound_); - } - - template< class Ch, class Tr, class Alloc> - unsigned char basic_format:: exceptions() const { - return exceptions_; - } - - template< class Ch, class Tr, class Alloc> - unsigned char basic_format:: exceptions(unsigned char newexcept) { - unsigned char swp = exceptions_; - exceptions_ = newexcept; - return swp; - } - - template - void basic_format:: - make_or_reuse_data (std::size_t nbitems) { -#if !defined(BOOST_NO_STD_LOCALE) - Ch fill = ( BOOST_USE_FACET(std::ctype, getloc()) ). widen(' '); -#else - Ch fill = ' '; -#endif - if(items_.size() == 0) - items_.assign( nbitems, format_item_t(fill) ); - else { - if(nbitems>items_.size()) - items_.resize(nbitems, format_item_t(fill)); - bound_.resize(0); - for(std::size_t i=0; i < nbitems; ++i) - items_[i].reset(fill); // strings are resized, instead of reallocated - } - prefix_.resize(0); - } - - template< class Ch, class Tr, class Alloc> - basic_format& basic_format:: - clear () { - // empty the string buffers (except bound arguments) - // and make the format object ready for formatting a new set of arguments - - BOOST_ASSERT( bound_.size()==0 || num_args_ == static_cast(bound_.size()) ); - - for(unsigned long i=0; i - basic_format& basic_format:: - clear_binds () { - // remove all binds, then clear() - bound_.resize(0); - clear(); - return *this; - } - - template< class Ch, class Tr, class Alloc> - basic_format& basic_format:: - clear_bind (int argN) { - // remove the bind of ONE argument then clear() - if(argN<1 || argN > num_args_ || bound_.size()==0 || !bound_[argN-1] ) { - if( exceptions() & io::out_of_range_bit) - boost::throw_exception(io::out_of_range(argN, 1, num_args_+1 ) ); - else return *this; - } - bound_[argN-1]=false; - clear(); - return *this; - } - - template< class Ch, class Tr, class Alloc> - int basic_format:: - bound_args() const { - if(bound_.size()==0) - return 0; - int n=0; - for(int i=0; i - int basic_format:: - fed_args() const { - if(bound_.size()==0) - return cur_arg_; - int n=0; - for(int i=0; i - int basic_format:: - cur_arg() const { - return cur_arg_+1; } - - template< class Ch, class Tr, class Alloc> - int basic_format:: - remaining_args() const { - if(bound_.size()==0) - return num_args_-cur_arg_; - int n=0; - for(int i=cur_arg_; i - typename basic_format::string_type - basic_format:: - str () const { - if(items_.size()==0) - return prefix_; - if( cur_arg_ < num_args_) - if( exceptions() & io::too_few_args_bit ) - // not enough variables supplied - boost::throw_exception(io::too_few_args(cur_arg_, num_args_)); - - unsigned long i; - string_type res; - res.reserve(size()); - res += prefix_; - for(i=0; i < items_.size(); ++i) { - const format_item_t& item = items_[i]; - res += item.res_; - if( item.argN_ == format_item_t::argN_tabulation) { - BOOST_ASSERT( item.pad_scheme_ & format_item_t::tabulation); - if( static_cast(item.fmtstate_.width_) > res.size() ) - res.append( static_cast(item.fmtstate_.width_) - res.size(), - item.fmtstate_.fill_ ); - } - res += item.appendix_; - } - dumped_=true; - return res; - } - template< class Ch, class Tr, class Alloc> - typename std::basic_string::size_type basic_format:: - size () const { -#ifdef BOOST_MSVC - // If std::min or std::max are already instantiated - // at this point then we get a blizzard of warning messages when we call - // those templates with std::size_t as arguments. Weird and very annoyning... -#pragma warning(push) -#pragma warning(disable:4267) -#endif - BOOST_USING_STD_MAX(); - size_type sz = prefix_.size(); - unsigned long i; - for(i=0; i < items_.size(); ++i) { - const format_item_t& item = items_[i]; - sz += item.res_.size(); - if( item.argN_ == format_item_t::argN_tabulation) - sz = max BOOST_PREVENT_MACRO_SUBSTITUTION (sz, - static_cast(item.fmtstate_.width_) ); - sz += item.appendix_.size(); - } - return sz; -#ifdef BOOST_MSVC -#pragma warning(pop) -#endif - } - -namespace io { -namespace detail { - - template - basic_format& - bind_arg_body (basic_format& self, int argN, const T& val) { - // bind one argument to a fixed value - // this is persistent over clear() calls, thus also over str() and << - if(self.dumped_) - self.clear(); // needed because we will modify cur_arg_ - if(argN<1 || argN > self.num_args_) { - if( self.exceptions() & io::out_of_range_bit ) - boost::throw_exception(io::out_of_range(argN, 1, self.num_args_+1 ) ); - else return self; - } - if(self.bound_.size()==0) - self.bound_.assign(self.num_args_,false); - else - BOOST_ASSERT( self.num_args_ == static_cast(self.bound_.size()) ); - int o_cur_arg = self.cur_arg_; - self.cur_arg_ = argN-1; // arrays begin at 0 - - self.bound_[self.cur_arg_]=false; // if already set, we unset and re-sets.. - self.operator%(val); // put val at the right place, because cur_arg is set - - - // Now re-position cur_arg before leaving : - self.cur_arg_ = o_cur_arg; - self.bound_[argN-1]=true; - if(self.cur_arg_ == argN-1 ) { - // hum, now this arg is bound, so move to next free arg - while(self.cur_arg_ < self.num_args_ && self.bound_[self.cur_arg_]) - ++self.cur_arg_; - } - // In any case, we either have all args, or are on an unbound arg : - BOOST_ASSERT( self.cur_arg_ >= self.num_args_ || ! self.bound_[self.cur_arg_]); - return self; - } - - template basic_format& - modify_item_body (basic_format& self, int itemN, T manipulator) { - // applies a manipulator to the format_item describing a given directive. - // this is a permanent change, clear or reset won't cancel that. - if(itemN<1 || itemN > static_cast(self.items_.size() )) { - if( self.exceptions() & io::out_of_range_bit ) - boost::throw_exception(io::out_of_range(itemN, 1, static_cast(self.items_.size()) )); - else return self; - } - self.items_[itemN-1].fmtstate_. template apply_manip ( manipulator ); - return self; - } - -} // namespace detail -} // namespace io -} // namespace boost - - - -#endif // BOOST_FORMAT_IMPLEMENTATION_HPP diff --git a/3rdparty/boost/boost/format/free_funcs.hpp b/3rdparty/boost/boost/format/free_funcs.hpp deleted file mode 100644 index 3a51545526..0000000000 --- a/3rdparty/boost/boost/format/free_funcs.hpp +++ /dev/null @@ -1,70 +0,0 @@ -// ---------------------------------------------------------------------------- -// free_funcs.hpp : implementation of the free functions of boost::format -// ---------------------------------------------------------------------------- - -// Copyright Samuel Krempp 2003. Use, modification, and distribution are -// subject to the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org/libs/format for library home page - -// ---------------------------------------------------------------------------- - -#ifndef BOOST_FORMAT_FUNCS_HPP -#define BOOST_FORMAT_FUNCS_HPP - -#include -#include - -namespace boost { - - template inline - std::basic_string str(const basic_format& f) { - // adds up all pieces of strings and converted items, and return the formatted string - return f.str(); - } - namespace io { - using ::boost::str; // keep compatibility with when it was defined in this N.S. - } // - namespace io - -#ifndef BOOST_NO_TEMPLATE_STD_STREAM - template - std::basic_ostream & - operator<<( std::basic_ostream & os, - const basic_format& f) -#else - template - std::ostream & - operator<<( std::ostream & os, - const basic_format& f) -#endif - // effect: "return os << str(f);" but we can do it faster - { - typedef boost::basic_format format_t; - if(f.items_.size()==0) - os << f.prefix_; - else { - if(f.cur_arg_ < f.num_args_) - if( f.exceptions() & io::too_few_args_bit ) - // not enough variables supplied - boost::throw_exception(io::too_few_args(f.cur_arg_, f.num_args_)); - if(f.style_ & format_t::special_needs) - os << f.str(); - else { - // else we dont have to count chars output, so we dump directly to os : - os << f.prefix_; - for(unsigned long i=0; i - - -namespace boost { -namespace io { - - -namespace detail { - - -// empty group, but useful even though. -struct group0 -{ - group0() {} -}; - -template -inline -BOOST_IO_STD basic_ostream& -operator << ( BOOST_IO_STD basic_ostream& os, - const group0& ) -{ - return os; -} - -template -struct group1 -{ - T1 a1_; - group1(T1 a1) - : a1_(a1) - {} -private: - group1& operator=(const group1&); -}; - -template -inline -BOOST_IO_STD basic_ostream& -operator << (BOOST_IO_STD basic_ostream& os, - const group1& x) -{ - os << x.a1_; - return os; -} - - - - -template -struct group2 -{ - T1 a1_; - T2 a2_; - group2(T1 a1,T2 a2) - : a1_(a1),a2_(a2) - {} -private: - group2& operator=(const group2&); -}; - -template -inline -BOOST_IO_STD basic_ostream& -operator << (BOOST_IO_STD basic_ostream& os, - const group2& x) -{ - os << x.a1_<< x.a2_; - return os; -} - -template -struct group3 -{ - T1 a1_; - T2 a2_; - T3 a3_; - group3(T1 a1,T2 a2,T3 a3) - : a1_(a1),a2_(a2),a3_(a3) - {} -private: - group3& operator=(const group3&); -}; - -template -inline -BOOST_IO_STD basic_ostream& -operator << (BOOST_IO_STD basic_ostream& os, - const group3& x) -{ - os << x.a1_<< x.a2_<< x.a3_; - return os; -} - -template -struct group4 -{ - T1 a1_; - T2 a2_; - T3 a3_; - T4 a4_; - group4(T1 a1,T2 a2,T3 a3,T4 a4) - : a1_(a1),a2_(a2),a3_(a3),a4_(a4) - {} -private: - group4& operator=(const group4&); -}; - -template -inline -BOOST_IO_STD basic_ostream& -operator << (BOOST_IO_STD basic_ostream& os, - const group4& x) -{ - os << x.a1_<< x.a2_<< x.a3_<< x.a4_; - return os; -} - -template -struct group5 -{ - T1 a1_; - T2 a2_; - T3 a3_; - T4 a4_; - T5 a5_; - group5(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) - : a1_(a1),a2_(a2),a3_(a3),a4_(a4),a5_(a5) - {} -}; - -template -inline -BOOST_IO_STD basic_ostream& -operator << (BOOST_IO_STD basic_ostream& os, - const group5& x) -{ - os << x.a1_<< x.a2_<< x.a3_<< x.a4_<< x.a5_; - return os; -} - -template -struct group6 -{ - T1 a1_; - T2 a2_; - T3 a3_; - T4 a4_; - T5 a5_; - T6 a6_; - group6(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) - : a1_(a1),a2_(a2),a3_(a3),a4_(a4),a5_(a5),a6_(a6) - {} -}; - -template -inline -BOOST_IO_STD basic_ostream& -operator << (BOOST_IO_STD basic_ostream& os, - const group6& x) -{ - os << x.a1_<< x.a2_<< x.a3_<< x.a4_<< x.a5_<< x.a6_; - return os; -} - -template -struct group7 -{ - T1 a1_; - T2 a2_; - T3 a3_; - T4 a4_; - T5 a5_; - T6 a6_; - T7 a7_; - group7(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) - : a1_(a1),a2_(a2),a3_(a3),a4_(a4),a5_(a5),a6_(a6),a7_(a7) - {} -}; - -template -inline -BOOST_IO_STD basic_ostream& -operator << (BOOST_IO_STD basic_ostream& os, - const group7& x) -{ - os << x.a1_<< x.a2_<< x.a3_<< x.a4_<< x.a5_<< x.a6_<< x.a7_; - return os; -} - -template -struct group8 -{ - T1 a1_; - T2 a2_; - T3 a3_; - T4 a4_; - T5 a5_; - T6 a6_; - T7 a7_; - T8 a8_; - group8(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) - : a1_(a1),a2_(a2),a3_(a3),a4_(a4),a5_(a5),a6_(a6),a7_(a7),a8_(a8) - {} -}; - -template -inline -BOOST_IO_STD basic_ostream& -operator << (BOOST_IO_STD basic_ostream& os, - const group8& x) -{ - os << x.a1_<< x.a2_<< x.a3_<< x.a4_<< x.a5_<< x.a6_<< x.a7_<< x.a8_; - return os; -} - -template -struct group9 -{ - T1 a1_; - T2 a2_; - T3 a3_; - T4 a4_; - T5 a5_; - T6 a6_; - T7 a7_; - T8 a8_; - T9 a9_; - group9(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8,T9 a9) - : a1_(a1),a2_(a2),a3_(a3),a4_(a4),a5_(a5),a6_(a6),a7_(a7),a8_(a8),a9_(a9) - {} -}; - -template -inline -BOOST_IO_STD basic_ostream& -operator << (BOOST_IO_STD basic_ostream& os, - const group9& x) -{ - os << x.a1_<< x.a2_<< x.a3_<< x.a4_<< x.a5_<< x.a6_<< x.a7_<< x.a8_<< x.a9_; - return os; -} - -template -struct group10 -{ - T1 a1_; - T2 a2_; - T3 a3_; - T4 a4_; - T5 a5_; - T6 a6_; - T7 a7_; - T8 a8_; - T9 a9_; - T10 a10_; - group10(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8,T9 a9,T10 a10) - : a1_(a1),a2_(a2),a3_(a3),a4_(a4),a5_(a5),a6_(a6),a7_(a7),a8_(a8),a9_(a9),a10_(a10) - {} -}; - -template -inline -BOOST_IO_STD basic_ostream& -operator << (BOOST_IO_STD basic_ostream& os, - const group10& x) -{ - os << x.a1_<< x.a2_<< x.a3_<< x.a4_<< x.a5_<< x.a6_<< x.a7_<< x.a8_<< x.a9_<< x.a10_; - return os; -} - - - - -template -inline -group1 -group_head( group2 const& x) -{ - return group1 (x.a1_); -} - -template -inline -group1 -group_last( group2 const& x) -{ - return group1 (x.a2_); -} - - - -template -inline -group2 -group_head( group3 const& x) -{ - return group2 (x.a1_,x.a2_); -} - -template -inline -group1 -group_last( group3 const& x) -{ - return group1 (x.a3_); -} - - - -template -inline -group3 -group_head( group4 const& x) -{ - return group3 (x.a1_,x.a2_,x.a3_); -} - -template -inline -group1 -group_last( group4 const& x) -{ - return group1 (x.a4_); -} - - - -template -inline -group4 -group_head( group5 const& x) -{ - return group4 (x.a1_,x.a2_,x.a3_,x.a4_); -} - -template -inline -group1 -group_last( group5 const& x) -{ - return group1 (x.a5_); -} - - - -template -inline -group5 -group_head( group6 const& x) -{ - return group5 (x.a1_,x.a2_,x.a3_,x.a4_,x.a5_); -} - -template -inline -group1 -group_last( group6 const& x) -{ - return group1 (x.a6_); -} - - - -template -inline -group6 -group_head( group7 const& x) -{ - return group6 (x.a1_,x.a2_,x.a3_,x.a4_,x.a5_,x.a6_); -} - -template -inline -group1 -group_last( group7 const& x) -{ - return group1 (x.a7_); -} - - - -template -inline -group7 -group_head( group8 const& x) -{ - return group7 (x.a1_,x.a2_,x.a3_,x.a4_,x.a5_,x.a6_,x.a7_); -} - -template -inline -group1 -group_last( group8 const& x) -{ - return group1 (x.a8_); -} - - - -template -inline -group8 -group_head( group9 const& x) -{ - return group8 (x.a1_,x.a2_,x.a3_,x.a4_,x.a5_,x.a6_,x.a7_,x.a8_); -} - -template -inline -group1 -group_last( group9 const& x) -{ - return group1 (x.a9_); -} - - - -template -inline -group9 -group_head( group10 const& x) -{ - return group9 (x.a1_,x.a2_,x.a3_,x.a4_,x.a5_,x.a6_,x.a7_,x.a8_,x.a9_); -} - -template -inline -group1 -group_last( group10 const& x) -{ - return group1 (x.a10_); -} - - - - - -} // namespace detail - - - -// helper functions - - -inline detail::group1< detail::group0 > -group() { return detail::group1< detail::group0 > ( detail::group0() ); } - -template -inline -detail::group1< detail::group2 > - group(T1 a1, Var const& var) -{ - return detail::group1< detail::group2 > - ( detail::group2 - (a1, var) - ); -} - -template -inline -detail::group1< detail::group3 > - group(T1 a1,T2 a2, Var const& var) -{ - return detail::group1< detail::group3 > - ( detail::group3 - (a1,a2, var) - ); -} - -template -inline -detail::group1< detail::group4 > - group(T1 a1,T2 a2,T3 a3, Var const& var) -{ - return detail::group1< detail::group4 > - ( detail::group4 - (a1,a2,a3, var) - ); -} - -template -inline -detail::group1< detail::group5 > - group(T1 a1,T2 a2,T3 a3,T4 a4, Var const& var) -{ - return detail::group1< detail::group5 > - ( detail::group5 - (a1,a2,a3,a4, var) - ); -} - -template -inline -detail::group1< detail::group6 > - group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5, Var const& var) -{ - return detail::group1< detail::group6 > - ( detail::group6 - (a1,a2,a3,a4,a5, var) - ); -} - -template -inline -detail::group1< detail::group7 > - group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6, Var const& var) -{ - return detail::group1< detail::group7 > - ( detail::group7 - (a1,a2,a3,a4,a5,a6, var) - ); -} - -template -inline -detail::group1< detail::group8 > - group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7, Var const& var) -{ - return detail::group1< detail::group8 > - ( detail::group8 - (a1,a2,a3,a4,a5,a6,a7, var) - ); -} - -template -inline -detail::group1< detail::group9 > - group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8, Var const& var) -{ - return detail::group1< detail::group9 > - ( detail::group9 - (a1,a2,a3,a4,a5,a6,a7,a8, var) - ); -} - -template -inline -detail::group1< detail::group10 > - group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8,T9 a9, Var const& var) -{ - return detail::group1< detail::group10 > - ( detail::group10 - (a1,a2,a3,a4,a5,a6,a7,a8,a9, var) - ); -} - - -#ifndef BOOST_NO_OVERLOAD_FOR_NON_CONST - -template -inline -detail::group1< detail::group2 > - group(T1 a1, Var& var) -{ - return detail::group1< detail::group2 > - ( detail::group2 - (a1, var) - ); -} - -template -inline -detail::group1< detail::group3 > - group(T1 a1,T2 a2, Var& var) -{ - return detail::group1< detail::group3 > - ( detail::group3 - (a1,a2, var) - ); -} - -template -inline -detail::group1< detail::group4 > - group(T1 a1,T2 a2,T3 a3, Var& var) -{ - return detail::group1< detail::group4 > - ( detail::group4 - (a1,a2,a3, var) - ); -} - -template -inline -detail::group1< detail::group5 > - group(T1 a1,T2 a2,T3 a3,T4 a4, Var& var) -{ - return detail::group1< detail::group5 > - ( detail::group5 - (a1,a2,a3,a4, var) - ); -} - -template -inline -detail::group1< detail::group6 > - group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5, Var& var) -{ - return detail::group1< detail::group6 > - ( detail::group6 - (a1,a2,a3,a4,a5, var) - ); -} - -template -inline -detail::group1< detail::group7 > - group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6, Var& var) -{ - return detail::group1< detail::group7 > - ( detail::group7 - (a1,a2,a3,a4,a5,a6, var) - ); -} - -template -inline -detail::group1< detail::group8 > - group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7, Var& var) -{ - return detail::group1< detail::group8 > - ( detail::group8 - (a1,a2,a3,a4,a5,a6,a7, var) - ); -} - -template -inline -detail::group1< detail::group9 > - group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8, Var& var) -{ - return detail::group1< detail::group9 > - ( detail::group9 - (a1,a2,a3,a4,a5,a6,a7,a8, var) - ); -} - -template -inline -detail::group1< detail::group10 > - group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8,T9 a9, Var& var) -{ - return detail::group1< detail::group10 > - ( detail::group10 - (a1,a2,a3,a4,a5,a6,a7,a8,a9, var) - ); -} - - -#endif // - BOOST_NO_OVERLOAD_FOR_NON_CONST - - -} // namespace io - -} // namespace boost - - -#endif // BOOST_FORMAT_GROUP_HPP diff --git a/3rdparty/boost/boost/format/internals.hpp b/3rdparty/boost/boost/format/internals.hpp deleted file mode 100644 index 1c67006aee..0000000000 --- a/3rdparty/boost/boost/format/internals.hpp +++ /dev/null @@ -1,202 +0,0 @@ -// ---------------------------------------------------------------------------- -// internals.hpp : internal structs : stream_format_state, format_item. -// included by format.hpp -// ---------------------------------------------------------------------------- - -// Copyright Samuel Krempp 2003. Use, modification, and distribution are -// subject to the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org/libs/format for library home page - -// ---------------------------------------------------------------------------- - -#ifndef BOOST_FORMAT_INTERNALS_HPP -#define BOOST_FORMAT_INTERNALS_HPP - - -#include -#include -#include -#include -#include -#include // used as a dummy stream - -namespace boost { -namespace io { -namespace detail { - - -//---- stream_format_state --------------------------------------------------// - -// set of params that define the format state of a stream - template - struct stream_format_state - { - typedef BOOST_IO_STD basic_ios basic_ios; - - stream_format_state(Ch fill) { reset(fill); } -// stream_format_state(const basic_ios& os) { set_by_stream(os); } - - void reset(Ch fill); //- sets to default state. - void set_by_stream(const basic_ios& os); //- sets to os's state. - void apply_on(basic_ios & os, //- applies format_state to the stream - boost::io::detail::locale_t * loc_default = 0) const; - template - void apply_manip(T manipulator) //- modifies state by applying manipulator - { apply_manip_body( *this, manipulator) ; } - - // --- data --- - std::streamsize width_; - std::streamsize precision_; - Ch fill_; - std::ios_base::fmtflags flags_; - std::ios_base::iostate rdstate_; - std::ios_base::iostate exceptions_; - boost::optional loc_; - }; - - -//---- format_item ---------------------------------------------------------// - -// stores all parameters that can be specified in format strings - template - struct format_item - { - enum pad_values { zeropad = 1, spacepad =2, centered=4, tabulation = 8 }; - // 1. if zeropad is set, all other bits are not, - // 2. if tabulation is set, all others are not. - // centered and spacepad can be mixed freely. - enum arg_values { argN_no_posit = -1, // non-positional directive. will set argN later - argN_tabulation = -2, // tabulation directive. (no argument read) - argN_ignored = -3 // ignored directive. (no argument read) - }; - typedef BOOST_IO_STD basic_ios basic_ios; - typedef detail::stream_format_state stream_format_state; - typedef ::std::basic_string string_type; - - format_item(Ch fill) :argN_(argN_no_posit), fmtstate_(fill), - truncate_(max_streamsize()), pad_scheme_(0) {} - void reset(Ch fill); - void compute_states(); // sets states according to truncate and pad_scheme. - - static std::streamsize max_streamsize() { - return (std::numeric_limits::max)(); - } - - // --- data --- - int argN_; //- argument number (starts at 0, eg : %1 => argN=0) - // negative values for items that don't process an argument - string_type res_; //- result of the formatting of this item - string_type appendix_; //- piece of string between this item and the next - - stream_format_state fmtstate_;// set by parsing, is only affected by modify_item - - std::streamsize truncate_;//- is set for directives like %.5s that ask truncation - unsigned int pad_scheme_;//- several possible padding schemes can mix. see pad_values - }; - - - -//--- Definitions ------------------------------------------------------------ - -// - stream_format_state:: ------------------------------------------------- - template - void stream_format_state:: apply_on (basic_ios & os, - boost::io::detail::locale_t * loc_default) const { - // If a locale is available, set it first. "os.fill(fill_);" may chrash otherwise. -#if !defined(BOOST_NO_STD_LOCALE) - if(loc_) - os.imbue(loc_.get()); - else if(loc_default) - os.imbue(*loc_default); -#else - (void) loc_default; // keep compiler quiet if we don't support locales -#endif - // set the state of this stream according to our params - if(width_ != -1) - os.width(width_); - if(precision_ != -1) - os.precision(precision_); - if(fill_ != 0) - os.fill(fill_); - os.flags(flags_); - os.clear(rdstate_); - os.exceptions(exceptions_); - } - - template - void stream_format_state:: set_by_stream(const basic_ios& os) { - // set our params according to the state of this stream - flags_ = os.flags(); - width_ = os.width(); - precision_ = os.precision(); - fill_ = os.fill(); - rdstate_ = os.rdstate(); - exceptions_ = os.exceptions(); - } - - - template - void apply_manip_body( stream_format_state& self, - T manipulator) { - // modify our params according to the manipulator - basic_oaltstringstream ss; - self.apply_on( ss ); - ss << manipulator; - self.set_by_stream( ss ); - } - - template inline - void stream_format_state:: reset(Ch fill) { - // set our params to standard's default state. cf 27.4.4.1 of the C++ norm - width_=0; precision_=6; - fill_=fill; // default is widen(' '), but we cant compute it without the locale - flags_ = std::ios_base::dec | std::ios_base::skipws; - // the adjust_field part is left equal to 0, which means right. - exceptions_ = std::ios_base::goodbit; - rdstate_ = std::ios_base::goodbit; - } - - -// --- format_item:: -------------------------------------------------------- - - template - void format_item:: - reset (Ch fill) { - argN_=argN_no_posit; truncate_ = max_streamsize(); pad_scheme_ =0; - res_.resize(0); appendix_.resize(0); - fmtstate_.reset(fill); - } - - template - void format_item:: - compute_states() { - // reflect pad_scheme_ on fmt_state_ - // because some pad_schemes has complex consequences on several state params. - if(pad_scheme_ & zeropad) { - // ignore zeropad in left alignment : - if(fmtstate_.flags_ & std::ios_base::left) { - BOOST_ASSERT(!(fmtstate_.flags_ &(std::ios_base::adjustfield ^std::ios_base::left))); - // only left bit might be set. (not right, nor internal) - pad_scheme_ = pad_scheme_ & (~zeropad); - } - else { - pad_scheme_ &= ~spacepad; // printf ignores spacepad when zeropadding - fmtstate_.fill_='0'; - fmtstate_.flags_ = (fmtstate_.flags_ & ~std::ios_base::adjustfield) - | std::ios_base::internal; - // removes all adjustfield bits, and adds internal. - } - } - if(pad_scheme_ & spacepad) { - if(fmtstate_.flags_ & std::ios_base::showpos) - pad_scheme_ &= ~spacepad; - } - } - - -} } } // namespaces boost :: io :: detail - - -#endif // BOOST_FORMAT_INTERNALS_HPP diff --git a/3rdparty/boost/boost/format/internals_fwd.hpp b/3rdparty/boost/boost/format/internals_fwd.hpp deleted file mode 100644 index 18cf122412..0000000000 --- a/3rdparty/boost/boost/format/internals_fwd.hpp +++ /dev/null @@ -1,64 +0,0 @@ -// ---------------------------------------------------------------------------- -// internals_fwd.hpp : forward declarations, for internal headers -// ---------------------------------------------------------------------------- - -// Copyright Samuel Krempp 2003. Use, modification, and distribution are -// subject to the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org/libs/format for library home page - -// ---------------------------------------------------------------------------- - -#ifndef BOOST_FORMAT_INTERNAL_FWD_HPP -#define BOOST_FORMAT_INTERNAL_FWD_HPP - -#include -#include - - -namespace boost { -namespace io { - -namespace detail { - template struct stream_format_state; - template struct format_item; - - - // these functions were intended as methods, - // but MSVC have problems with template member functions : - // defined in format_implementation.hpp : - template - basic_format& - modify_item_body (basic_format& self, - int itemN, T manipulator); - - template - basic_format& - bind_arg_body (basic_format& self, - int argN, const T& val); - - // in internals.hpp : - template - void apply_manip_body (stream_format_state& self, - T manipulator); - - // argument feeding (defined in feed_args.hpp ) : - template - void distribute (basic_format& self, T x); - - template - basic_format& - feed (basic_format& self, T x); - - template - basic_format& - feed_impl (basic_format& self, T x); - -} // namespace detail - -} // namespace io -} // namespace boost - - -#endif // BOOST_FORMAT_INTERNAL_FWD_HPP diff --git a/3rdparty/boost/boost/format/parsing.hpp b/3rdparty/boost/boost/format/parsing.hpp deleted file mode 100644 index 04ddf368e1..0000000000 --- a/3rdparty/boost/boost/format/parsing.hpp +++ /dev/null @@ -1,501 +0,0 @@ -// ---------------------------------------------------------------------------- -// parsing.hpp : implementation of the parsing member functions -// ( parse, parse_printf_directive) -// ---------------------------------------------------------------------------- - -// Copyright Samuel Krempp 2003. Use, modification, and distribution are -// subject to the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -// see http://www.boost.org/libs/format for library home page - -// ---------------------------------------------------------------------------- - -#ifndef BOOST_FORMAT_PARSING_HPP -#define BOOST_FORMAT_PARSING_HPP - - -#include -#include -#include -#include - - -namespace boost { -namespace io { -namespace detail { - -#if defined(BOOST_NO_STD_LOCALE) - // streams will be used for narrow / widen. but these methods are not const - template - T& const_or_not(const T& x) { - return const_cast (x); - } -#else - template - const T& const_or_not(const T& x) { - return x; - } -#endif - - template inline - char wrap_narrow(const Facet& fac, Ch c, char deflt) { - return const_or_not(fac).narrow(c, deflt); - } - - template inline - bool wrap_isdigit(const Facet& fac, Ch c) { -#if ! defined( BOOST_NO_LOCALE_ISDIGIT ) - return fac.is(std::ctype::digit, c); -# else - (void) fac; // remove "unused parameter" warning - using namespace std; - return isdigit(c) != 0; -#endif - } - - template - Iter wrap_scan_notdigit(const Facet & fac, Iter beg, Iter end) { - using namespace std; - for( ; beg!=end && wrap_isdigit(fac, *beg); ++beg) ; - return beg; - } - - - // Input : [start, last) iterators range and a - // a Facet to use its widen/narrow member function - // Effects : read sequence and convert digits into integral n, of type Res - // Returns : n - template - Iter str2int (const Iter & start, const Iter & last, Res & res, - const Facet& fac) - { - using namespace std; - Iter it; - res=0; - for(it=start; it != last && wrap_isdigit(fac, *it); ++it ) { - char cur_ch = wrap_narrow(fac, *it, 0); // cant fail. - res *= 10; - res += cur_ch - '0'; // 22.2.1.1.2.13 of the C++ standard - } - return it; - } - - // skip printf's "asterisk-fields" directives in the format-string buf - // Input : char string, with starting index *pos_p - // a Facet merely to use its widen/narrow member function - // Effects : advance *pos_p by skipping printf's asterisk fields. - // Returns : nothing - template - Iter skip_asterisk(Iter start, Iter last, const Facet& fac) - { - using namespace std; - ++ start; - start = wrap_scan_notdigit(fac, start, last); - if(start!=last && *start== const_or_not(fac).widen( '$') ) - ++start; - return start; - } - - - // auxiliary func called by parse_printf_directive - // for centralising error handling - // it either throws if user sets the corresponding flag, or does nothing. - inline void maybe_throw_exception(unsigned char exceptions, - std::size_t pos, std::size_t size) - { - if(exceptions & io::bad_format_string_bit) - boost::throw_exception(io::bad_format_string(pos, size) ); - } - - - // Input: the position of a printf-directive in the format-string - // a basic_ios& merely to use its widen/narrow member function - // a bitset'exceptions' telling whether to throw exceptions on errors. - // Returns: - // true if parse succeeded (ignore some errors if exceptions disabled) - // false if it failed so bad that the directive should be printed verbatim - // Effects: - // start is incremented so that *start is the first char after - // this directive - // *fpar is set with the parameters read in the directive - template - bool parse_printf_directive(Iter & start, const Iter& last, - detail::format_item * fpar, - const Facet& fac, - std::size_t offset, unsigned char exceptions) - { - typedef typename basic_format::format_item_t format_item_t; - - fpar->argN_ = format_item_t::argN_no_posit; // if no positional-directive - bool precision_set = false; - bool in_brackets=false; - Iter start0 = start; - std::size_t fstring_size = last-start0+offset; - - if(start>= last) { // empty directive : this is a trailing % - maybe_throw_exception(exceptions, start-start0 + offset, fstring_size); - return false; - } - - if(*start== const_or_not(fac).widen( '|')) { - in_brackets=true; - if( ++start >= last ) { - maybe_throw_exception(exceptions, start-start0 + offset, fstring_size); - return false; - } - } - - // the flag '0' would be picked as a digit for argument order, but here it's a flag : - if(*start== const_or_not(fac).widen( '0')) - goto parse_flags; - - // handle argument order (%2$d) or possibly width specification: %2d - if(wrap_isdigit(fac, *start)) { - int n; - start = str2int(start, last, n, fac); - if( start >= last ) { - maybe_throw_exception(exceptions, start-start0+offset, fstring_size); - return false; - } - - // %N% case : this is already the end of the directive - if( *start == const_or_not(fac).widen( '%') ) { - fpar->argN_ = n-1; - ++start; - if( in_brackets) - maybe_throw_exception(exceptions, start-start0+offset, fstring_size); - // but don't return. maybe "%" was used in lieu of '$', so we go on. - else - return true; - } - - if ( *start== const_or_not(fac).widen( '$') ) { - fpar->argN_ = n-1; - ++start; - } - else { - // non-positionnal directive - fpar->fmtstate_.width_ = n; - fpar->argN_ = format_item_t::argN_no_posit; - goto parse_precision; - } - } - - parse_flags: - // handle flags - while ( start != last) { // as long as char is one of + - = _ # 0 l h or ' ' - // misc switches - switch ( wrap_narrow(fac, *start, 0)) { - case '\'' : break; // no effect yet. (painful to implement) - case 'l': - case 'h': // short/long modifier : for printf-comaptibility (no action needed) - break; - case '-': - fpar->fmtstate_.flags_ |= std::ios_base::left; - break; - case '=': - fpar->pad_scheme_ |= format_item_t::centered; - break; - case '_': - fpar->fmtstate_.flags_ |= std::ios_base::internal; - break; - case ' ': - fpar->pad_scheme_ |= format_item_t::spacepad; - break; - case '+': - fpar->fmtstate_.flags_ |= std::ios_base::showpos; - break; - case '0': - fpar->pad_scheme_ |= format_item_t::zeropad; - // need to know alignment before really setting flags, - // so just add 'zeropad' flag for now, it will be processed later. - break; - case '#': - fpar->fmtstate_.flags_ |= std::ios_base::showpoint | std::ios_base::showbase; - break; - default: - goto parse_width; - } - ++start; - } // loop on flag. - - if( start>=last) { - maybe_throw_exception(exceptions, start-start0+offset, fstring_size); - return true; - } - parse_width: - // handle width spec - // first skip 'asterisk fields' : *, or *N$ - if(*start == const_or_not(fac).widen( '*') ) - start = skip_asterisk(start, last, fac); - if(start!=last && wrap_isdigit(fac, *start)) - start = str2int(start, last, fpar->fmtstate_.width_, fac); - - parse_precision: - if( start>= last) { - maybe_throw_exception(exceptions, start-start0+offset, fstring_size); - return true; - } - // handle precision spec - if (*start== const_or_not(fac).widen( '.')) { - ++start; - if(start != last && *start == const_or_not(fac).widen( '*') ) - start = skip_asterisk(start, last, fac); - if(start != last && wrap_isdigit(fac, *start)) { - start = str2int(start, last, fpar->fmtstate_.precision_, fac); - precision_set = true; - } - else - fpar->fmtstate_.precision_ =0; - } - - // handle formatting-type flags : - while( start != last && ( *start== const_or_not(fac).widen( 'l') - || *start== const_or_not(fac).widen( 'L') - || *start== const_or_not(fac).widen( 'h')) ) - ++start; - if( start>=last) { - maybe_throw_exception(exceptions, start-start0+offset, fstring_size); - return true; - } - - if( in_brackets && *start== const_or_not(fac).widen( '|') ) { - ++start; - return true; - } - switch ( wrap_narrow(fac, *start, 0) ) { - case 'X': - fpar->fmtstate_.flags_ |= std::ios_base::uppercase; - case 'p': // pointer => set hex. - case 'x': - fpar->fmtstate_.flags_ &= ~std::ios_base::basefield; - fpar->fmtstate_.flags_ |= std::ios_base::hex; - break; - - case 'o': - fpar->fmtstate_.flags_ &= ~std::ios_base::basefield; - fpar->fmtstate_.flags_ |= std::ios_base::oct; - break; - - case 'E': - fpar->fmtstate_.flags_ |= std::ios_base::uppercase; - case 'e': - fpar->fmtstate_.flags_ &= ~std::ios_base::floatfield; - fpar->fmtstate_.flags_ |= std::ios_base::scientific; - - fpar->fmtstate_.flags_ &= ~std::ios_base::basefield; - fpar->fmtstate_.flags_ |= std::ios_base::dec; - break; - - case 'f': - fpar->fmtstate_.flags_ &= ~std::ios_base::floatfield; - fpar->fmtstate_.flags_ |= std::ios_base::fixed; - case 'u': - case 'd': - case 'i': - fpar->fmtstate_.flags_ &= ~std::ios_base::basefield; - fpar->fmtstate_.flags_ |= std::ios_base::dec; - break; - - case 'T': - ++start; - if( start >= last) - maybe_throw_exception(exceptions, start-start0+offset, fstring_size); - else - fpar->fmtstate_.fill_ = *start; - fpar->pad_scheme_ |= format_item_t::tabulation; - fpar->argN_ = format_item_t::argN_tabulation; - break; - case 't': - fpar->fmtstate_.fill_ = const_or_not(fac).widen( ' '); - fpar->pad_scheme_ |= format_item_t::tabulation; - fpar->argN_ = format_item_t::argN_tabulation; - break; - - case 'G': - fpar->fmtstate_.flags_ |= std::ios_base::uppercase; - break; - case 'g': // 'g' conversion is default for floats. - fpar->fmtstate_.flags_ &= ~std::ios_base::basefield; - fpar->fmtstate_.flags_ |= std::ios_base::dec; - - // CLEAR all floatield flags, so stream will CHOOSE - fpar->fmtstate_.flags_ &= ~std::ios_base::floatfield; - break; - - case 'C': - case 'c': - fpar->truncate_ = 1; - break; - case 'S': - case 's': - if(precision_set) // handle truncation manually, with own parameter. - fpar->truncate_ = fpar->fmtstate_.precision_; - fpar->fmtstate_.precision_ = 6; // default stream precision. - break; - case 'n' : - fpar->argN_ = format_item_t::argN_ignored; - break; - default: - maybe_throw_exception(exceptions, start-start0+offset, fstring_size); - } - ++start; - - if( in_brackets ) { - if( start != last && *start== const_or_not(fac).widen( '|') ) { - ++start; - return true; - } - else maybe_throw_exception(exceptions, start-start0+offset, fstring_size); - } - return true; - } - // -end parse_printf_directive() - - template - int upper_bound_from_fstring(const String& buf, - const typename String::value_type arg_mark, - const Facet& fac, - unsigned char exceptions) - { - // quick-parsing of the format-string to count arguments mark (arg_mark, '%') - // returns : upper bound on the number of format items in the format strings - using namespace boost::io; - typename String::size_type i1=0; - int num_items=0; - while( (i1=buf.find(arg_mark,i1)) != String::npos ) { - if( i1+1 >= buf.size() ) { - if(exceptions & bad_format_string_bit) - boost::throw_exception(bad_format_string(i1, buf.size() )); // must not end in ".. %" - else { - ++num_items; - break; - } - } - if(buf[i1+1] == buf[i1] ) {// escaped "%%" - i1+=2; continue; - } - - ++i1; - // in case of %N% directives, dont count it double (wastes allocations..) : - i1 = detail::wrap_scan_notdigit(fac, buf.begin()+i1, buf.end()) - buf.begin(); - if( i1 < buf.size() && buf[i1] == arg_mark ) - ++i1; - ++num_items; - } - return num_items; - } - template inline - void append_string(String& dst, const String& src, - const typename String::size_type beg, - const typename String::size_type end) { - dst.append(src.begin()+beg, src.begin()+end); - } - -} // detail namespace -} // io namespace - - - -// ----------------------------------------------- -// format :: parse(..) - - template - basic_format& basic_format:: - parse (const string_type& buf) { - // parse the format-string - using namespace std; -#if !defined(BOOST_NO_STD_LOCALE) - const std::ctype & fac = BOOST_USE_FACET( std::ctype, getloc()); -#else - io::basic_oaltstringstream fac; - //has widen and narrow even on compilers without locale -#endif - - const Ch arg_mark = io::detail::const_or_not(fac).widen( '%'); - bool ordered_args=true; - int max_argN=-1; - - // A: find upper_bound on num_items and allocates arrays - int num_items = io::detail::upper_bound_from_fstring(buf, arg_mark, fac, exceptions()); - make_or_reuse_data(num_items); - - // B: Now the real parsing of the format string : - num_items=0; - typename string_type::size_type i0=0, i1=0; - typename string_type::const_iterator it; - bool special_things=false; - int cur_item=0; - while( (i1=buf.find(arg_mark,i1)) != string_type::npos ) { - string_type & piece = (cur_item==0) ? prefix_ : items_[cur_item-1].appendix_; - if( buf[i1+1] == buf[i1] ) { // escaped mark, '%%' - io::detail::append_string(piece, buf, i0, i1+1); - i1+=2; i0=i1; - continue; - } - BOOST_ASSERT( static_cast(cur_item) < items_.size() || cur_item==0); - - if(i1!=i0) { - io::detail::append_string(piece, buf, i0, i1); - i0=i1; - } - ++i1; - it = buf.begin()+i1; - bool parse_ok = io::detail::parse_printf_directive( - it, buf.end(), &items_[cur_item], fac, i1, exceptions()); - i1 = it - buf.begin(); - if( ! parse_ok ) // the directive will be printed verbatim - continue; - i0=i1; - items_[cur_item].compute_states(); // process complex options, like zeropad, into params - - int argN=items_[cur_item].argN_; - if(argN == format_item_t::argN_ignored) - continue; - if(argN ==format_item_t::argN_no_posit) - ordered_args=false; - else if(argN == format_item_t::argN_tabulation) special_things=true; - else if(argN > max_argN) max_argN = argN; - ++num_items; - ++cur_item; - } // loop on %'s - BOOST_ASSERT(cur_item == num_items); - - // store the final piece of string - { - string_type & piece = (cur_item==0) ? prefix_ : items_[cur_item-1].appendix_; - io::detail::append_string(piece, buf, i0, buf.size()); - } - - if( !ordered_args) { - if(max_argN >= 0 ) { // dont mix positional with non-positionnal directives - if(exceptions() & io::bad_format_string_bit) - boost::throw_exception( - io::bad_format_string(static_cast(max_argN), 0)); - // else do nothing. => positionnal arguments are processed as non-positionnal - } - // set things like it would have been with positional directives : - int non_ordered_items = 0; - for(int i=0; i< num_items; ++i) - if(items_[i].argN_ == format_item_t::argN_no_posit) { - items_[i].argN_ = non_ordered_items; - ++non_ordered_items; - } - max_argN = non_ordered_items-1; - } - - // C: set some member data : - items_.resize(num_items, format_item_t(io::detail::const_or_not(fac).widen( ' ')) ); - - if(special_things) style_ |= special_needs; - num_args_ = max_argN + 1; - if(ordered_args) style_ |= ordered; - else style_ &= ~ordered; - return *this; - } - -} // namespace boost - - -#endif // BOOST_FORMAT_PARSING_HPP diff --git a/3rdparty/boost/extract.sh b/3rdparty/boost/extract.sh index 2fa7bc8371..ecfcadaefa 100755 --- a/3rdparty/boost/extract.sh +++ b/3rdparty/boost/extract.sh @@ -25,7 +25,6 @@ bcp --boost=$1 \ boost/bind.hpp \ boost/crc.hpp \ boost/cstdint.hpp \ - boost/format.hpp \ boost/function.hpp \ boost/functional.hpp \ boost/lexical_cast.hpp \ diff --git a/configure.ac b/configure.ac index 3d88a08fb0..8438b14485 100644 --- a/configure.ac +++ b/configure.ac @@ -305,12 +305,6 @@ extern "C" char * strerror(int n); #endif -#if defined(HAVE_OSTREAM) && defined(HAVE_LOCALE) && defined(HAVE_SSTREAM) -# define USE_BOOST_FORMAT 1 -#else -# define USE_BOOST_FORMAT 0 -#endif - #define BOOST_USER_CONFIG #if !defined(ENABLE_ASSERTIONS) diff --git a/development/cmake/configCompiler.h.cmake b/development/cmake/configCompiler.h.cmake index 6eb627add7..29ff1990e6 100644 --- a/development/cmake/configCompiler.h.cmake +++ b/development/cmake/configCompiler.h.cmake @@ -85,12 +85,6 @@ #define BOOST_ALL_NO_LIB 1 -#if defined(HAVE_OSTREAM) && defined(HAVE_LOCALE) && defined(HAVE_SSTREAM) -# define USE_BOOST_FORMAT 1 -#else -# define USE_BOOST_FORMAT 0 -#endif - #ifdef _DEBUG # define ENABLE_ASSERTIONS 1 #endif diff --git a/development/cmake/configCompiler.h.msvc b/development/cmake/configCompiler.h.msvc index 5ff2e9dcf3..bec1a4113c 100644 --- a/development/cmake/configCompiler.h.msvc +++ b/development/cmake/configCompiler.h.msvc @@ -124,12 +124,6 @@ #define BOOST_ALL_NO_LIB 1 -#if defined(HAVE_OSTREAM) && defined(HAVE_LOCALE) && defined(HAVE_SSTREAM) -# define USE_BOOST_FORMAT 1 -#else -# define USE_BOOST_FORMAT 0 -#endif - #ifdef _DEBUG # define ENABLE_ASSERTIONS 1 #endif diff --git a/src/Chktex.cpp b/src/Chktex.cpp index 02271e308c..816837a025 100644 --- a/src/Chktex.cpp +++ b/src/Chktex.cpp @@ -21,8 +21,6 @@ #include "support/lstrings.h" #include "support/Systemcall.h" -#include - using namespace std; using namespace lyx::support; @@ -58,11 +56,7 @@ int Chktex::scanLogFile(TeXErrors & terr) // or whether makeAbsPath(onlyFileName()) is a noop here FileName const tmp(makeAbsPath(onlyFileName(changeExtension(file, ".log")))); -#if USE_BOOST_FORMAT - boost::basic_format msg(_("ChkTeX warning id # %1$d")); -#else - docstring const msg(_("ChkTeX warning id # ")); -#endif + docstring const msg(_("ChkTeX warning id # %1$s")); docstring token; // FIXME UNICODE // We have no idea what the encoding of the error file is @@ -81,13 +75,7 @@ int Chktex::scanLogFile(TeXErrors & terr) int const lineno = convert(line); -#if USE_BOOST_FORMAT - msg % warno; - terr.insertError(lineno, msg.str(), warning); - msg.clear(); -#else - terr.insertError(lineno, msg + warno, warning); -#endif + terr.insertError(lineno, bformat(msg, warno), warning); ++retval; } diff --git a/src/Chktex.h b/src/Chktex.h index 16481e7d67..34826bbcea 100644 --- a/src/Chktex.h +++ b/src/Chktex.h @@ -17,7 +17,6 @@ namespace lyx { -class Lexer; class TeXErrors; From 68a1f9a44ea36691ada208d4c7d3d49ffab32f3b Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Thu, 19 May 2016 15:28:39 +0200 Subject: [PATCH 52/76] Do not use of boost::tokenizer It is easier to use instead getVectorFromString for the use we have of this tokenizer. The two places are environment.cpp (path stuff) and qt_helpers (file fileters). The new code is much shorter. This allow to remove boost/tokenizer.hpp and friends from our boost tree. --- 3rdparty/boost/boost/token_functions.hpp | 651 ----------------------- 3rdparty/boost/boost/token_iterator.hpp | 128 ----- 3rdparty/boost/boost/tokenizer.hpp | 98 ---- 3rdparty/boost/extract.sh | 1 - src/frontends/qt4/qt_helpers.cpp | 13 +- src/support/environment.cpp | 29 +- 6 files changed, 9 insertions(+), 911 deletions(-) delete mode 100644 3rdparty/boost/boost/token_functions.hpp delete mode 100644 3rdparty/boost/boost/token_iterator.hpp delete mode 100644 3rdparty/boost/boost/tokenizer.hpp diff --git a/3rdparty/boost/boost/token_functions.hpp b/3rdparty/boost/boost/token_functions.hpp deleted file mode 100644 index be245a047f..0000000000 --- a/3rdparty/boost/boost/token_functions.hpp +++ /dev/null @@ -1,651 +0,0 @@ -// Boost token_functions.hpp ------------------------------------------------// - -// Copyright John R. Bandela 2001. - -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org/libs/tokenizer/ for documentation. - -// Revision History: -// 01 Oct 2004 Joaquin M Lopez Munoz -// Workaround for a problem with string::assign in msvc-stlport -// 06 Apr 2004 John Bandela -// Fixed a bug involving using char_delimiter with a true input iterator -// 28 Nov 2003 Robert Zeh and John Bandela -// Converted into "fast" functions that avoid using += when -// the supplied iterator isn't an input_iterator; based on -// some work done at Archelon and a version that was checked into -// the boost CVS for a short period of time. -// 20 Feb 2002 John Maddock -// Removed using namespace std declarations and added -// workaround for BOOST_NO_STDC_NAMESPACE (the library -// can be safely mixed with regex). -// 06 Feb 2002 Jeremy Siek -// Added char_separator. -// 02 Feb 2002 Jeremy Siek -// Removed tabs and a little cleanup. - - -#ifndef BOOST_TOKEN_FUNCTIONS_JRB120303_HPP_ -#define BOOST_TOKEN_FUNCTIONS_JRB120303_HPP_ - -#include -#include -#include -#include -#include // for find_if -#include -#include -#include -#include -#include -#if !defined(BOOST_NO_CWCTYPE) -#include -#endif - -// -// the following must not be macros if we are to prefix them -// with std:: (they shouldn't be macros anyway...) -// -#ifdef ispunct -# undef ispunct -#endif -#ifdef iswpunct -# undef iswpunct -#endif -#ifdef isspace -# undef isspace -#endif -#ifdef iswspace -# undef iswspace -#endif -// -// fix namespace problems: -// -#ifdef BOOST_NO_STDC_NAMESPACE -namespace std{ - using ::ispunct; - using ::isspace; -#if !defined(BOOST_NO_CWCTYPE) - using ::iswpunct; - using ::iswspace; -#endif -} -#endif - -namespace boost{ - //=========================================================================== - // The escaped_list_separator class. Which is a model of TokenizerFunction - // An escaped list is a super-set of what is commonly known as a comma - // separated value (csv) list.It is separated into fields by a comma or - // other character. If the delimiting character is inside quotes, then it is - // counted as a regular character.To allow for embedded quotes in a field, - // there can be escape sequences using the \ much like C. - // The role of the comma, the quotation mark, and the escape - // character (backslash \), can be assigned to other characters. - - struct escaped_list_error : public std::runtime_error{ - escaped_list_error(const std::string& what_arg):std::runtime_error(what_arg) { } - }; - - -// The out of the box GCC 2.95 on cygwin does not have a char_traits class. -// MSVC does not like the following typename - template ::traits_type > - class escaped_list_separator { - - private: - typedef std::basic_string string_type; - struct char_eq { - Char e_; - char_eq(Char e):e_(e) { } - bool operator()(Char c) { - return Traits::eq(e_,c); - } - }; - string_type escape_; - string_type c_; - string_type quote_; - bool last_; - - bool is_escape(Char e) { - char_eq f(e); - return std::find_if(escape_.begin(),escape_.end(),f)!=escape_.end(); - } - bool is_c(Char e) { - char_eq f(e); - return std::find_if(c_.begin(),c_.end(),f)!=c_.end(); - } - bool is_quote(Char e) { - char_eq f(e); - return std::find_if(quote_.begin(),quote_.end(),f)!=quote_.end(); - } - template - void do_escape(iterator& next,iterator end,Token& tok) { - if (++next == end) - BOOST_THROW_EXCEPTION(escaped_list_error(std::string("cannot end with escape"))); - if (Traits::eq(*next,'n')) { - tok+='\n'; - return; - } - else if (is_quote(*next)) { - tok+=*next; - return; - } - else if (is_c(*next)) { - tok+=*next; - return; - } - else if (is_escape(*next)) { - tok+=*next; - return; - } - else - BOOST_THROW_EXCEPTION(escaped_list_error(std::string("unknown escape sequence"))); - } - - public: - - explicit escaped_list_separator(Char e = '\\', - Char c = ',',Char q = '\"') - : escape_(1,e), c_(1,c), quote_(1,q), last_(false) { } - - escaped_list_separator(string_type e, string_type c, string_type q) - : escape_(e), c_(c), quote_(q), last_(false) { } - - void reset() {last_=false;} - - template - bool operator()(InputIterator& next,InputIterator end,Token& tok) { - bool bInQuote = false; - tok = Token(); - - if (next == end) { - if (last_) { - last_ = false; - return true; - } - else - return false; - } - last_ = false; - for (;next != end;++next) { - if (is_escape(*next)) { - do_escape(next,end,tok); - } - else if (is_c(*next)) { - if (!bInQuote) { - // If we are not in quote, then we are done - ++next; - // The last character was a c, that means there is - // 1 more blank field - last_ = true; - return true; - } - else tok+=*next; - } - else if (is_quote(*next)) { - bInQuote=!bInQuote; - } - else { - tok += *next; - } - } - return true; - } - }; - - //=========================================================================== - // The classes here are used by offset_separator and char_separator to implement - // faster assigning of tokens using assign instead of += - - namespace tokenizer_detail { - //=========================================================================== - // Tokenizer was broken for wide character separators, at least on Windows, since - // CRT functions isspace etc only expect values in [0, 0xFF]. Debug build asserts - // if higher values are passed in. The traits extension class should take care of this. - // Assuming that the conditional will always get optimized out in the function - // implementations, argument types are not a problem since both forms of character classifiers - // expect an int. - -#if !defined(BOOST_NO_CWCTYPE) - template - struct traits_extension_details : public traits { - typedef typename traits::char_type char_type; - static bool isspace(char_type c) - { - return std::iswspace(c) != 0; - } - static bool ispunct(char_type c) - { - return std::iswpunct(c) != 0; - } - }; - - template - struct traits_extension_details : public traits { - typedef typename traits::char_type char_type; - static bool isspace(char_type c) - { - return std::isspace(c) != 0; - } - static bool ispunct(char_type c) - { - return std::ispunct(c) != 0; - } - }; -#endif - - - // In case there is no cwctype header, we implement the checks manually. - // We make use of the fact that the tested categories should fit in ASCII. - template - struct traits_extension : public traits { - typedef typename traits::char_type char_type; - static bool isspace(char_type c) - { -#if !defined(BOOST_NO_CWCTYPE) - return traits_extension_details::isspace(c); -#else - return static_cast< unsigned >(c) <= 255 && std::isspace(c) != 0; -#endif - } - - static bool ispunct(char_type c) - { -#if !defined(BOOST_NO_CWCTYPE) - return traits_extension_details::ispunct(c); -#else - return static_cast< unsigned >(c) <= 255 && std::ispunct(c) != 0; -#endif - } - }; - - // The assign_or_plus_equal struct contains functions that implement - // assign, +=, and clearing based on the iterator type. The - // generic case does nothing for plus_equal and clearing, while - // passing through the call for assign. - // - // When an input iterator is being used, the situation is reversed. - // The assign method does nothing, plus_equal invokes operator +=, - // and the clearing method sets the supplied token to the default - // token constructor's result. - // - - template - struct assign_or_plus_equal { - template - static void assign(Iterator b, Iterator e, Token &t) { - t.assign(b, e); - } - - template - static void plus_equal(Token &, const Value &) { } - - // If we are doing an assign, there is no need for the - // the clear. - // - template - static void clear(Token &) { } - }; - - template <> - struct assign_or_plus_equal { - template - static void assign(Iterator , Iterator , Token &) { } - template - static void plus_equal(Token &t, const Value &v) { - t += v; - } - template - static void clear(Token &t) { - t = Token(); - } - }; - - - template - struct pointer_iterator_category{ - typedef std::random_access_iterator_tag type; - }; - - - template - struct class_iterator_category{ - typedef typename Iterator::iterator_category type; - }; - - - - // This portably gets the iterator_tag without partial template specialization - template - struct get_iterator_category{ - typedef typename mpl::if_, - pointer_iterator_category, - class_iterator_category - >::type cat; - - typedef typename cat::type iterator_category; - }; - - - } // namespace tokenizer_detail - - - //=========================================================================== - // The offset_separator class, which is a model of TokenizerFunction. - // Offset breaks a string into tokens based on a range of offsets - - class offset_separator { - private: - - std::vector offsets_; - unsigned int current_offset_; - bool wrap_offsets_; - bool return_partial_last_; - - public: - template - offset_separator(Iter begin, Iter end, bool wrap_offsets = true, - bool return_partial_last = true) - : offsets_(begin,end), current_offset_(0), - wrap_offsets_(wrap_offsets), - return_partial_last_(return_partial_last) { } - - offset_separator() - : offsets_(1,1), current_offset_(), - wrap_offsets_(true), return_partial_last_(true) { } - - void reset() { - current_offset_ = 0; - } - - template - bool operator()(InputIterator& next, InputIterator end, Token& tok) - { - typedef tokenizer_detail::assign_or_plus_equal< - BOOST_DEDUCED_TYPENAME tokenizer_detail::get_iterator_category< - InputIterator - >::iterator_category - > assigner; - - BOOST_ASSERT(!offsets_.empty()); - - assigner::clear(tok); - InputIterator start(next); - - if (next == end) - return false; - - if (current_offset_ == offsets_.size()) - { - if (wrap_offsets_) - current_offset_=0; - else - return false; - } - - int c = offsets_[current_offset_]; - int i = 0; - for (; i < c; ++i) { - if (next == end)break; - assigner::plus_equal(tok,*next++); - } - assigner::assign(start,next,tok); - - if (!return_partial_last_) - if (i < (c-1) ) - return false; - - ++current_offset_; - return true; - } - }; - - - //=========================================================================== - // The char_separator class breaks a sequence of characters into - // tokens based on the character delimiters (very much like bad old - // strtok). A delimiter character can either be kept or dropped. A - // kept delimiter shows up as an output token, whereas a dropped - // delimiter does not. - - // This class replaces the char_delimiters_separator class. The - // constructor for the char_delimiters_separator class was too - // confusing and needed to be deprecated. However, because of the - // default arguments to the constructor, adding the new constructor - // would cause ambiguity, so instead I deprecated the whole class. - // The implementation of the class was also simplified considerably. - - enum empty_token_policy { drop_empty_tokens, keep_empty_tokens }; - - // The out of the box GCC 2.95 on cygwin does not have a char_traits class. - template ::traits_type > - class char_separator - { - typedef tokenizer_detail::traits_extension Traits; - typedef std::basic_string string_type; - public: - explicit - char_separator(const Char* dropped_delims, - const Char* kept_delims = 0, - empty_token_policy empty_tokens = drop_empty_tokens) - : m_dropped_delims(dropped_delims), - m_use_ispunct(false), - m_use_isspace(false), - m_empty_tokens(empty_tokens), - m_output_done(false) - { - // Borland workaround - if (kept_delims) - m_kept_delims = kept_delims; - } - - // use ispunct() for kept delimiters and isspace for dropped. - explicit - char_separator() - : m_use_ispunct(true), - m_use_isspace(true), - m_empty_tokens(drop_empty_tokens) { } - - void reset() { } - - template - bool operator()(InputIterator& next, InputIterator end, Token& tok) - { - typedef tokenizer_detail::assign_or_plus_equal< - BOOST_DEDUCED_TYPENAME tokenizer_detail::get_iterator_category< - InputIterator - >::iterator_category - > assigner; - - assigner::clear(tok); - - // skip past all dropped_delims - if (m_empty_tokens == drop_empty_tokens) - for (; next != end && is_dropped(*next); ++next) - { } - - InputIterator start(next); - - if (m_empty_tokens == drop_empty_tokens) { - - if (next == end) - return false; - - - // if we are on a kept_delims move past it and stop - if (is_kept(*next)) { - assigner::plus_equal(tok,*next); - ++next; - } else - // append all the non delim characters - for (; next != end && !is_dropped(*next) && !is_kept(*next); ++next) - assigner::plus_equal(tok,*next); - } - else { // m_empty_tokens == keep_empty_tokens - - // Handle empty token at the end - if (next == end) - { - if (m_output_done == false) - { - m_output_done = true; - assigner::assign(start,next,tok); - return true; - } - else - return false; - } - - if (is_kept(*next)) { - if (m_output_done == false) - m_output_done = true; - else { - assigner::plus_equal(tok,*next); - ++next; - m_output_done = false; - } - } - else if (m_output_done == false && is_dropped(*next)) { - m_output_done = true; - } - else { - if (is_dropped(*next)) - start=++next; - for (; next != end && !is_dropped(*next) && !is_kept(*next); ++next) - assigner::plus_equal(tok,*next); - m_output_done = true; - } - } - assigner::assign(start,next,tok); - return true; - } - - private: - string_type m_kept_delims; - string_type m_dropped_delims; - bool m_use_ispunct; - bool m_use_isspace; - empty_token_policy m_empty_tokens; - bool m_output_done; - - bool is_kept(Char E) const - { - if (m_kept_delims.length()) - return m_kept_delims.find(E) != string_type::npos; - else if (m_use_ispunct) { - return Traits::ispunct(E) != 0; - } else - return false; - } - bool is_dropped(Char E) const - { - if (m_dropped_delims.length()) - return m_dropped_delims.find(E) != string_type::npos; - else if (m_use_isspace) { - return Traits::isspace(E) != 0; - } else - return false; - } - }; - - //=========================================================================== - // The following class is DEPRECATED, use class char_separators instead. - // - // The char_delimiters_separator class, which is a model of - // TokenizerFunction. char_delimiters_separator breaks a string - // into tokens based on character delimiters. There are 2 types of - // delimiters. returnable delimiters can be returned as - // tokens. These are often punctuation. nonreturnable delimiters - // cannot be returned as tokens. These are often whitespace - - // The out of the box GCC 2.95 on cygwin does not have a char_traits class. - template ::traits_type > - class char_delimiters_separator { - private: - - typedef tokenizer_detail::traits_extension Traits; - typedef std::basic_string string_type; - string_type returnable_; - string_type nonreturnable_; - bool return_delims_; - bool no_ispunct_; - bool no_isspace_; - - bool is_ret(Char E)const - { - if (returnable_.length()) - return returnable_.find(E) != string_type::npos; - else{ - if (no_ispunct_) {return false;} - else{ - int r = Traits::ispunct(E); - return r != 0; - } - } - } - bool is_nonret(Char E)const - { - if (nonreturnable_.length()) - return nonreturnable_.find(E) != string_type::npos; - else{ - if (no_isspace_) {return false;} - else{ - int r = Traits::isspace(E); - return r != 0; - } - } - } - - public: - explicit char_delimiters_separator(bool return_delims = false, - const Char* returnable = 0, - const Char* nonreturnable = 0) - : returnable_(returnable ? returnable : string_type().c_str()), - nonreturnable_(nonreturnable ? nonreturnable:string_type().c_str()), - return_delims_(return_delims), no_ispunct_(returnable!=0), - no_isspace_(nonreturnable!=0) { } - - void reset() { } - - public: - - template - bool operator()(InputIterator& next, InputIterator end,Token& tok) { - tok = Token(); - - // skip past all nonreturnable delims - // skip past the returnable only if we are not returning delims - for (;next!=end && ( is_nonret(*next) || (is_ret(*next) - && !return_delims_ ) );++next) { } - - if (next == end) { - return false; - } - - // if we are to return delims and we are one a returnable one - // move past it and stop - if (is_ret(*next) && return_delims_) { - tok+=*next; - ++next; - } - else - // append all the non delim characters - for (;next!=end && !is_nonret(*next) && !is_ret(*next);++next) - tok+=*next; - - - return true; - } - }; - - -} //namespace boost - -#endif diff --git a/3rdparty/boost/boost/token_iterator.hpp b/3rdparty/boost/boost/token_iterator.hpp deleted file mode 100644 index 584fac28f4..0000000000 --- a/3rdparty/boost/boost/token_iterator.hpp +++ /dev/null @@ -1,128 +0,0 @@ -// Boost token_iterator.hpp -------------------------------------------------// - -// Copyright John R. Bandela 2001 -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org/libs/tokenizer for documentation. - -// Revision History: -// 16 Jul 2003 John Bandela -// Allowed conversions from convertible base iterators -// 03 Jul 2003 John Bandela -// Converted to new iterator adapter - - - -#ifndef BOOST_TOKENIZER_POLICY_JRB070303_HPP_ -#define BOOST_TOKENIZER_POLICY_JRB070303_HPP_ - -#include -#include -#include -#include -#include - -namespace boost -{ - template - class token_iterator - : public iterator_facade< - token_iterator - , Type - , typename iterators::minimum_category< - forward_traversal_tag - , typename iterator_traversal::type - >::type - , const Type& - > - { - - friend class iterator_core_access; - - TokenizerFunc f_; - Iterator begin_; - Iterator end_; - bool valid_; - Type tok_; - - void increment(){ - BOOST_ASSERT(valid_); - valid_ = f_(begin_,end_,tok_); - } - - const Type& dereference() const { - BOOST_ASSERT(valid_); - return tok_; - } - template - bool equal(const Other& a) const{ - return (a.valid_ && valid_) - ?( (a.begin_==begin_) && (a.end_ == end_) ) - :(a.valid_==valid_); - - } - - void initialize(){ - if(valid_) return; - f_.reset(); - valid_ = (begin_ != end_)? - f_(begin_,end_,tok_):false; - } - public: - token_iterator():begin_(),end_(),valid_(false),tok_() { } - - token_iterator(TokenizerFunc f, Iterator begin, Iterator e = Iterator()) - : f_(f),begin_(begin),end_(e),valid_(false),tok_(){ initialize(); } - - token_iterator(Iterator begin, Iterator e = Iterator()) - : f_(),begin_(begin),end_(e),valid_(false),tok_() {initialize();} - - template - token_iterator( - token_iterator const& t - , typename enable_if_convertible::type* = 0) - : f_(t.tokenizer_function()),begin_(t.base()) - ,end_(t.end()),valid_(!t.at_end()),tok_(t.current_token()) {} - - Iterator base()const{return begin_;} - - Iterator end()const{return end_;} - - TokenizerFunc tokenizer_function()const{return f_;} - - Type current_token()const{return tok_;} - - bool at_end()const{return !valid_;} - - - - - }; - template < - class TokenizerFunc = char_delimiters_separator, - class Iterator = std::string::const_iterator, - class Type = std::string - > - class token_iterator_generator { - - private: - public: - typedef token_iterator type; - }; - - - // Type has to be first because it needs to be explicitly specified - // because there is no way the function can deduce it. - template - typename token_iterator_generator::type - make_token_iterator(Iterator begin, Iterator end,const TokenizerFunc& fun){ - typedef typename - token_iterator_generator::type ret_type; - return ret_type(fun,begin,end); - } - -} // namespace boost - -#endif diff --git a/3rdparty/boost/boost/tokenizer.hpp b/3rdparty/boost/boost/tokenizer.hpp deleted file mode 100644 index 081e5ba2f7..0000000000 --- a/3rdparty/boost/boost/tokenizer.hpp +++ /dev/null @@ -1,98 +0,0 @@ -// Boost tokenizer.hpp -----------------------------------------------------// - -// (c) Copyright Jeremy Siek and John R. Bandela 2001. - -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org/libs/tokenizer for documenation - -// Revision History: -// 03 Jul 2003 John Bandela -// Converted to new iterator adapter -// 02 Feb 2002 Jeremy Siek -// Removed tabs and a little cleanup. - -#ifndef BOOST_TOKENIZER_JRB070303_HPP_ -#define BOOST_TOKENIZER_JRB070303_HPP_ - -#include - -namespace boost { - - - //=========================================================================== - // A container-view of a tokenized "sequence" - template < - typename TokenizerFunc = char_delimiters_separator, - typename Iterator = std::string::const_iterator, - typename Type = std::string - > - class tokenizer { - private: - typedef token_iterator_generator TGen; - - // It seems that MSVC does not like the unqualified use of iterator, - // Thus we use iter internally when it is used unqualified and - // the users of this class will always qualify iterator. - typedef typename TGen::type iter; - - public: - - typedef iter iterator; - typedef iter const_iterator; - typedef Type value_type; - typedef value_type& reference; - typedef const value_type& const_reference; - typedef value_type* pointer; - typedef const pointer const_pointer; - typedef void size_type; - typedef void difference_type; - - tokenizer(Iterator first, Iterator last, - const TokenizerFunc& f = TokenizerFunc()) - : first_(first), last_(last), f_(f) { } - - template - tokenizer(const Container& c) - : first_(c.begin()), last_(c.end()), f_() { } - - template - tokenizer(const Container& c,const TokenizerFunc& f) - : first_(c.begin()), last_(c.end()), f_(f) { } - - void assign(Iterator first, Iterator last){ - first_ = first; - last_ = last; - } - - void assign(Iterator first, Iterator last, const TokenizerFunc& f){ - assign(first,last); - f_ = f; - } - - template - void assign(const Container& c){ - assign(c.begin(),c.end()); - } - - - template - void assign(const Container& c, const TokenizerFunc& f){ - assign(c.begin(),c.end(),f); - } - - iter begin() const { return iter(f_,first_,last_); } - iter end() const { return iter(f_,last_,last_); } - - private: - Iterator first_; - Iterator last_; - TokenizerFunc f_; - }; - - -} // namespace boost - -#endif diff --git a/3rdparty/boost/extract.sh b/3rdparty/boost/extract.sh index ecfcadaefa..879a92634a 100755 --- a/3rdparty/boost/extract.sh +++ b/3rdparty/boost/extract.sh @@ -36,7 +36,6 @@ bcp --boost=$1 \ boost/signal.hpp \ boost/signals/connection.hpp \ boost/signals/trackable.hpp \ - boost/tokenizer.hpp \ boost/tuple/tuple.hpp \ boost/mpl/string.hpp \ boost/mpl/fold.hpp \ diff --git a/src/frontends/qt4/qt_helpers.cpp b/src/frontends/qt4/qt_helpers.cpp index c1294e56df..71498e865c 100644 --- a/src/frontends/qt4/qt_helpers.cpp +++ b/src/frontends/qt4/qt_helpers.cpp @@ -51,7 +51,6 @@ // for FileFilter. // FIXME: Remove #include "support/regex.h" -#include using namespace std; @@ -464,16 +463,12 @@ struct Filter Filter::Filter(docstring const & description, string const & globs) : desc_(description) { - typedef boost::tokenizer > Tokenizer; - boost::char_separator const separator(" "); - // Given " ... *.{abc,def} ", expand to // " ... *.abc *.def " string const expanded_globs = convert_brace_glob(globs); // Split into individual globs. - Tokenizer const tokens(expanded_globs, separator); - globs_ = vector(tokens.begin(), tokens.end()); + globs_ = getVectorFromString(expanded_globs, " "); } @@ -488,11 +483,7 @@ QString Filter::toString() const s += " ("; } - for (size_t i = 0; i != globs_.size(); ++i) { - if (i > 0) - s += ' '; - s += toqstr(globs_[i]); - } + s += toqstr(getStringFromVector(globs_, " ")); if (has_description) s += ')'; diff --git a/src/support/environment.cpp b/src/support/environment.cpp index ceaca60f54..091fa278c0 100644 --- a/src/support/environment.cpp +++ b/src/support/environment.cpp @@ -15,10 +15,10 @@ #include "support/environment.h" #include "support/docstring.h" +#include "support/lstrings.h" #include "support/os.h" -#include - +#include // for remove #include #include #include @@ -45,20 +45,10 @@ string const getEnv(string const & name) vector const getEnvPath(string const & name) { - typedef boost::char_separator Separator; - typedef boost::tokenizer Tokenizer; - string const env_var = getEnv(name); - Separator const separator(string(1, os::path_separator()).c_str()); - Tokenizer const tokens(env_var, separator); - Tokenizer::const_iterator it = tokens.begin(); - Tokenizer::const_iterator const end = tokens.end(); + string const separator(1, os::path_separator()); - vector vars; - for (; it != end; ++it) - vars.push_back(os::internal_path(*it)); - - return vars; + return getVectorFromString(env_var, separator); } @@ -104,18 +94,13 @@ void setEnvPath(string const & name, vector const & env) void prependEnvPath(string const & name, string const & prefix) { + string const separator(1, os::path_separator()); + vector reversed_tokens + = getVectorFromString(prefix, separator); vector env_var = getEnvPath(name); - typedef boost::char_separator Separator; - typedef boost::tokenizer Tokenizer; - - Separator const separator(string(1, os::path_separator()).c_str()); - // Prepend each new element to the list, removing identical elements // that occur later in the list. - Tokenizer const tokens(prefix, separator); - vector reversed_tokens(tokens.begin(), tokens.end()); - typedef vector::const_reverse_iterator token_iterator; token_iterator it = reversed_tokens.rbegin(); token_iterator const end = reversed_tokens.rend(); From 5ee778af752f9d0f97226365a5c73823ad9c2ffb Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Thu, 19 May 2016 17:13:07 +0200 Subject: [PATCH 53/76] Remove support/metahash.h It turns out that it did not take off since introduced in 2011. It is better to remove it and the associated boost headers (extract.sh was run against boost 1.60 to do the update). Since we will move away from several boost classes when transitioning to C++11, it is good to start by removing lesser used ones. --- .../boost/boost/iterator/minimum_category.hpp | 95 --- 3rdparty/boost/boost/mpl/aux_/empty_impl.hpp | 43 -- 3rdparty/boost/boost/mpl/aux_/insert_impl.hpp | 68 -- .../boost/mpl/aux_/insert_range_impl.hpp | 80 --- .../boost/boost/mpl/aux_/iter_push_front.hpp | 36 -- 3rdparty/boost/boost/mpl/aux_/joint_iter.hpp | 120 ---- 3rdparty/boost/boost/mpl/char.hpp | 22 - 3rdparty/boost/boost/mpl/char_fwd.hpp | 27 - 3rdparty/boost/boost/mpl/copy.hpp | 58 -- 3rdparty/boost/boost/mpl/empty.hpp | 39 -- 3rdparty/boost/boost/mpl/insert.hpp | 41 -- 3rdparty/boost/boost/mpl/insert_fwd.hpp | 24 - 3rdparty/boost/boost/mpl/insert_range.hpp | 41 -- 3rdparty/boost/boost/mpl/insert_range_fwd.hpp | 24 - 3rdparty/boost/boost/mpl/joint_view.hpp | 65 -- 3rdparty/boost/boost/mpl/limits/string.hpp | 21 - 3rdparty/boost/boost/mpl/string.hpp | 607 ------------------ .../boost/preprocessor/arithmetic/div.hpp | 39 -- .../boost/boost/type_traits/same_traits.hpp | 15 - 3rdparty/boost/extract.sh | 4 - src/Text.cpp | 24 - src/support/metahash.h | 73 --- 22 files changed, 1566 deletions(-) delete mode 100644 3rdparty/boost/boost/iterator/minimum_category.hpp delete mode 100644 3rdparty/boost/boost/mpl/aux_/empty_impl.hpp delete mode 100644 3rdparty/boost/boost/mpl/aux_/insert_impl.hpp delete mode 100644 3rdparty/boost/boost/mpl/aux_/insert_range_impl.hpp delete mode 100644 3rdparty/boost/boost/mpl/aux_/iter_push_front.hpp delete mode 100644 3rdparty/boost/boost/mpl/aux_/joint_iter.hpp delete mode 100644 3rdparty/boost/boost/mpl/char.hpp delete mode 100644 3rdparty/boost/boost/mpl/char_fwd.hpp delete mode 100644 3rdparty/boost/boost/mpl/copy.hpp delete mode 100644 3rdparty/boost/boost/mpl/empty.hpp delete mode 100644 3rdparty/boost/boost/mpl/insert.hpp delete mode 100644 3rdparty/boost/boost/mpl/insert_fwd.hpp delete mode 100644 3rdparty/boost/boost/mpl/insert_range.hpp delete mode 100644 3rdparty/boost/boost/mpl/insert_range_fwd.hpp delete mode 100644 3rdparty/boost/boost/mpl/joint_view.hpp delete mode 100644 3rdparty/boost/boost/mpl/limits/string.hpp delete mode 100644 3rdparty/boost/boost/mpl/string.hpp delete mode 100644 3rdparty/boost/boost/preprocessor/arithmetic/div.hpp delete mode 100644 3rdparty/boost/boost/type_traits/same_traits.hpp delete mode 100644 src/support/metahash.h diff --git a/3rdparty/boost/boost/iterator/minimum_category.hpp b/3rdparty/boost/boost/iterator/minimum_category.hpp deleted file mode 100644 index 15679bc77d..0000000000 --- a/3rdparty/boost/boost/iterator/minimum_category.hpp +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright David Abrahams 2003. Use, modification and distribution is -// subject to the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -#ifndef BOOST_ITERATOR_MINIMUM_CATEGORY_HPP_INCLUDED_ -# define BOOST_ITERATOR_MINIMUM_CATEGORY_HPP_INCLUDED_ - -# include -# include -# include - -# include -# include - -namespace boost { -namespace iterators { -namespace detail { - -template -struct minimum_category_impl; - -template -struct error_not_related_by_convertibility; - -template <> -struct minimum_category_impl -{ - template struct apply - { - typedef T2 type; - }; -}; - -template <> -struct minimum_category_impl -{ - template struct apply - { - typedef T1 type; - }; -}; - -template <> -struct minimum_category_impl -{ - template struct apply - { - BOOST_STATIC_ASSERT((is_same::value)); - typedef T1 type; - }; -}; - -template <> -struct minimum_category_impl -{ - template struct apply - : error_not_related_by_convertibility - { - }; -}; - -} // namespace detail - -// -// Returns the minimum category type or fails to compile -// if T1 and T2 are unrelated. -// -template -struct minimum_category -{ - typedef boost::iterators::detail::minimum_category_impl< - ::boost::is_convertible::value - , ::boost::is_convertible::value - > outer; - - typedef typename outer::template apply inner; - typedef typename inner::type type; - - BOOST_MPL_AUX_LAMBDA_SUPPORT(2,minimum_category,(T1,T2)) -}; - -template <> -struct minimum_category -{ - template - struct apply : minimum_category - {}; - - BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2,minimum_category,(mpl::_1,mpl::_2)) -}; - -} // namespace iterators - -} // namespace boost - -#endif // BOOST_ITERATOR_MINIMUM_CATEGORY_HPP_INCLUDED_ diff --git a/3rdparty/boost/boost/mpl/aux_/empty_impl.hpp b/3rdparty/boost/boost/mpl/aux_/empty_impl.hpp deleted file mode 100644 index cfe55ae252..0000000000 --- a/3rdparty/boost/boost/mpl/aux_/empty_impl.hpp +++ /dev/null @@ -1,43 +0,0 @@ - -#ifndef BOOST_MPL_AUX_EMPTY_IMPL_HPP_INCLUDED -#define BOOST_MPL_AUX_EMPTY_IMPL_HPP_INCLUDED - -// Copyright Aleksey Gurtovoy 2000-2004 -// -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org/libs/mpl for documentation. - -// $Id$ -// $Date$ -// $Revision$ - -#include -#include -#include -#include - -namespace boost { namespace mpl { - -// default implementation; conrete sequences might override it by -// specializing either the 'empty_impl' or the primary 'empty' template - -template< typename Tag > -struct empty_impl -{ - template< typename Sequence > struct apply - : is_same< - typename begin::type - , typename end::type - > - { - }; -}; - -BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC(1,empty_impl) - -}} - -#endif // BOOST_MPL_AUX_EMPTY_IMPL_HPP_INCLUDED diff --git a/3rdparty/boost/boost/mpl/aux_/insert_impl.hpp b/3rdparty/boost/boost/mpl/aux_/insert_impl.hpp deleted file mode 100644 index 03a304b580..0000000000 --- a/3rdparty/boost/boost/mpl/aux_/insert_impl.hpp +++ /dev/null @@ -1,68 +0,0 @@ - -#ifndef BOOST_MPL_INSERT_IMPL_HPP_INCLUDED -#define BOOST_MPL_INSERT_IMPL_HPP_INCLUDED - -// Copyright Aleksey Gurtovoy 2000-2004 -// -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org/libs/mpl for documentation. - -// $Id$ -// $Date$ -// $Revision$ - -#include -#include -#include -#include -#include -#include -#include - -namespace boost { namespace mpl { - -// default implementation; conrete sequences might override it by -// specializing either the 'insert_impl' or the primary 'insert' template - -template< typename Tag > -struct insert_impl -{ - template< - typename Sequence - , typename Pos - , typename T - > - struct apply - { - typedef iterator_range< - typename begin::type - , Pos - > first_half_; - - typedef iterator_range< - Pos - , typename end::type - > second_half_; - - typedef typename reverse_fold< - second_half_ - , typename clear::type - , push_front<_,_> - >::type half_sequence_; - - typedef typename reverse_fold< - first_half_ - , typename push_front::type - , push_front<_,_> - >::type type; - }; -}; - -BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC(3,insert_impl) - -}} - -#endif // BOOST_MPL_INSERT_IMPL_HPP_INCLUDED diff --git a/3rdparty/boost/boost/mpl/aux_/insert_range_impl.hpp b/3rdparty/boost/boost/mpl/aux_/insert_range_impl.hpp deleted file mode 100644 index fa4331562d..0000000000 --- a/3rdparty/boost/boost/mpl/aux_/insert_range_impl.hpp +++ /dev/null @@ -1,80 +0,0 @@ - -#ifndef BOOST_MPL_AUX_INSERT_RANGE_IMPL_HPP_INCLUDED -#define BOOST_MPL_AUX_INSERT_RANGE_IMPL_HPP_INCLUDED - -// Copyright Aleksey Gurtovoy 2000-2004 -// -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org/libs/mpl for documentation. - -// $Id$ -// $Date$ -// $Revision$ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -namespace boost { namespace mpl { - -// default implementation; conrete sequences might override it by -// specializing either the 'insert_range_impl' or the primary -// 'insert_range' template - - -template< typename Tag > -struct insert_range_impl -{ - template< - typename Sequence - , typename Pos - , typename Range - > - struct apply -#if !defined(BOOST_MPL_CFG_NO_NESTED_FORWARDING) - : reverse_fold< - joint_view< - iterator_range::type,Pos> - , joint_view< - Range - , iterator_range::type> - > - > - , typename clear::type - , insert<_1, begin<_1>, _2> - > - { -#else - { - typedef typename reverse_fold< - joint_view< - iterator_range::type,Pos> - , joint_view< - Range - , iterator_range::type> - > - > - , typename clear::type - , insert<_1, begin<_1>, _2> - >::type type; -#endif - }; -}; - -BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC(3,insert_range_impl) - -}} - -#endif // BOOST_MPL_AUX_INSERT_RANGE_IMPL_HPP_INCLUDED diff --git a/3rdparty/boost/boost/mpl/aux_/iter_push_front.hpp b/3rdparty/boost/boost/mpl/aux_/iter_push_front.hpp deleted file mode 100644 index 35ccc4dfbb..0000000000 --- a/3rdparty/boost/boost/mpl/aux_/iter_push_front.hpp +++ /dev/null @@ -1,36 +0,0 @@ - -#ifndef BOOST_MPL_ITER_PUSH_FRONT_HPP_INCLUDED -#define BOOST_MPL_ITER_PUSH_FRONT_HPP_INCLUDED - -// Copyright Aleksey Gurtovoy 2002-2004 -// -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org/libs/mpl for documentation. - -// $Id$ -// $Date$ -// $Revision$ - -#include -#include - -namespace boost { namespace mpl { namespace aux { - -template< - typename Sequence - , typename Iterator - > -struct iter_push_front -{ - typedef typename push_front< - Sequence - , typename deref::type - >::type type; -}; - -}}} - -#endif // BOOST_MPL_ITER_PUSH_FRONT_HPP_INCLUDED diff --git a/3rdparty/boost/boost/mpl/aux_/joint_iter.hpp b/3rdparty/boost/boost/mpl/aux_/joint_iter.hpp deleted file mode 100644 index 277580eebf..0000000000 --- a/3rdparty/boost/boost/mpl/aux_/joint_iter.hpp +++ /dev/null @@ -1,120 +0,0 @@ - -#ifndef BOOST_MPL_AUX_JOINT_ITER_HPP_INCLUDED -#define BOOST_MPL_AUX_JOINT_ITER_HPP_INCLUDED - -// Copyright Aleksey Gurtovoy 2000-2004 -// -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org/libs/mpl for documentation. - -// $Id$ -// $Date$ -// $Revision$ - -#include -#include -#include -#include -#include - -#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) -# include -#endif - -namespace boost { namespace mpl { - -#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) - -template< - typename Iterator1 - , typename LastIterator1 - , typename Iterator2 - > -struct joint_iter -{ - typedef Iterator1 base; - typedef forward_iterator_tag category; -}; - -template< - typename LastIterator1 - , typename Iterator2 - > -struct joint_iter -{ - typedef Iterator2 base; - typedef forward_iterator_tag category; -}; - - -template< typename I1, typename L1, typename I2 > -struct deref< joint_iter > -{ - typedef typename joint_iter::base base_; - typedef typename deref::type type; -}; - -template< typename I1, typename L1, typename I2 > -struct next< joint_iter > -{ - typedef joint_iter< typename mpl::next::type,L1,I2 > type; -}; - -template< typename L1, typename I2 > -struct next< joint_iter > -{ - typedef joint_iter< L1,L1,typename mpl::next::type > type; -}; - -#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -template< - typename Iterator1 - , typename LastIterator1 - , typename Iterator2 - > -struct joint_iter; - -template< bool > struct joint_iter_impl -{ - template< typename I1, typename L1, typename I2 > struct result_ - { - typedef I1 base; - typedef forward_iterator_tag category; - typedef joint_iter< typename mpl::next::type,L1,I2 > next; - typedef typename deref::type type; - }; -}; - -template<> struct joint_iter_impl -{ - template< typename I1, typename L1, typename I2 > struct result_ - { - typedef I2 base; - typedef forward_iterator_tag category; - typedef joint_iter< L1,L1,typename mpl::next::type > next; - typedef typename deref::type type; - }; -}; - -template< - typename Iterator1 - , typename LastIterator1 - , typename Iterator2 - > -struct joint_iter - : joint_iter_impl< is_same::value > - ::template result_ -{ -}; - -#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -BOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(3, joint_iter) - -}} - -#endif // BOOST_MPL_AUX_JOINT_ITER_HPP_INCLUDED diff --git a/3rdparty/boost/boost/mpl/char.hpp b/3rdparty/boost/boost/mpl/char.hpp deleted file mode 100644 index 08828c247a..0000000000 --- a/3rdparty/boost/boost/mpl/char.hpp +++ /dev/null @@ -1,22 +0,0 @@ - -#ifndef BOOST_MPL_CHAR_HPP_INCLUDED -#define BOOST_MPL_CHAR_HPP_INCLUDED - -// Copyright Eric Niebler 2008 -// -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org/libs/mpl for documentation. - -// $Source$ -// $Date: 2008-06-14 08:41:37 -0700 (Sat, 16 Jun 2008) $ -// $Revision: 24874 $ - -#include - -#define AUX_WRAPPER_VALUE_TYPE char -#include - -#endif // BOOST_MPL_CHAR_HPP_INCLUDED diff --git a/3rdparty/boost/boost/mpl/char_fwd.hpp b/3rdparty/boost/boost/mpl/char_fwd.hpp deleted file mode 100644 index 442d0a1619..0000000000 --- a/3rdparty/boost/boost/mpl/char_fwd.hpp +++ /dev/null @@ -1,27 +0,0 @@ - -#ifndef BOOST_MPL_CHAR_FWD_HPP_INCLUDED -#define BOOST_MPL_CHAR_FWD_HPP_INCLUDED - -// Copyright Eric Niebler 2008 -// -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org/libs/mpl for documentation. - -// $Source$ -// $Date: 2008-06-14 08:41:37 -0700 (Sat, 16 Jun 2008) $ -// $Revision: 24874 $ - -#include -#include - -BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN - -template< BOOST_MPL_AUX_NTTP_DECL(char, N) > struct char_; - -BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE -BOOST_MPL_AUX_ADL_BARRIER_DECL(char_) - -#endif // BOOST_MPL_CHAR_FWD_HPP_INCLUDED diff --git a/3rdparty/boost/boost/mpl/copy.hpp b/3rdparty/boost/boost/mpl/copy.hpp deleted file mode 100644 index 6eafba3982..0000000000 --- a/3rdparty/boost/boost/mpl/copy.hpp +++ /dev/null @@ -1,58 +0,0 @@ - -#ifndef BOOST_MPL_COPY_HPP_INCLUDED -#define BOOST_MPL_COPY_HPP_INCLUDED - -// Copyright Aleksey Gurtovoy 2000-2004 -// Copyright David Abrahams 2003-2004 -// -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org/libs/mpl for documentation. - -// $Id$ -// $Date$ -// $Revision$ - -#include -#include -#include - -namespace boost { namespace mpl { - -namespace aux { - -template< - typename Sequence - , typename Inserter - > -struct copy_impl - : fold< - Sequence - , typename Inserter::state - , typename Inserter::operation - > -{ -}; - -template< - typename Sequence - , typename Inserter - > -struct reverse_copy_impl - : reverse_fold< - Sequence - , typename Inserter::state - , typename Inserter::operation - > -{ -}; - -} // namespace aux - -BOOST_MPL_AUX_INSERTER_ALGORITHM_DEF(2, copy) - -}} - -#endif // BOOST_MPL_COPY_HPP_INCLUDED diff --git a/3rdparty/boost/boost/mpl/empty.hpp b/3rdparty/boost/boost/mpl/empty.hpp deleted file mode 100644 index 1185324c1b..0000000000 --- a/3rdparty/boost/boost/mpl/empty.hpp +++ /dev/null @@ -1,39 +0,0 @@ - -#ifndef BOOST_MPL_EMPTY_HPP_INCLUDED -#define BOOST_MPL_EMPTY_HPP_INCLUDED - -// Copyright Aleksey Gurtovoy 2000-2004 -// -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org/libs/mpl for documentation. - -// $Id$ -// $Date$ -// $Revision$ - -#include -#include -#include -#include -#include - -namespace boost { namespace mpl { - -template< - typename BOOST_MPL_AUX_NA_PARAM(Sequence) - > -struct empty - : empty_impl< typename sequence_tag::type > - ::template apply< Sequence > -{ - BOOST_MPL_AUX_LAMBDA_SUPPORT(1,empty,(Sequence)) -}; - -BOOST_MPL_AUX_NA_SPEC(1, empty) - -}} - -#endif // BOOST_MPL_EMPTY_HPP_INCLUDED diff --git a/3rdparty/boost/boost/mpl/insert.hpp b/3rdparty/boost/boost/mpl/insert.hpp deleted file mode 100644 index 5e379a4978..0000000000 --- a/3rdparty/boost/boost/mpl/insert.hpp +++ /dev/null @@ -1,41 +0,0 @@ - -#ifndef BOOST_MPL_INSERT_HPP_INCLUDED -#define BOOST_MPL_INSERT_HPP_INCLUDED - -// Copyright Aleksey Gurtovoy 2000-2004 -// -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org/libs/mpl for documentation. - -// $Id$ -// $Date$ -// $Revision$ - -#include -#include -#include -#include -#include - -namespace boost { namespace mpl { - -template< - typename BOOST_MPL_AUX_NA_PARAM(Sequence) - , typename BOOST_MPL_AUX_NA_PARAM(Pos_or_T) - , typename BOOST_MPL_AUX_NA_PARAM(T) - > -struct insert - : insert_impl< typename sequence_tag::type > - ::template apply< Sequence,Pos_or_T,T > -{ - BOOST_MPL_AUX_LAMBDA_SUPPORT(3,insert,(Sequence,Pos_or_T,T)) -}; - -BOOST_MPL_AUX_NA_SPEC(3, insert) - -}} - -#endif // BOOST_MPL_INSERT_HPP_INCLUDED diff --git a/3rdparty/boost/boost/mpl/insert_fwd.hpp b/3rdparty/boost/boost/mpl/insert_fwd.hpp deleted file mode 100644 index ba6b161760..0000000000 --- a/3rdparty/boost/boost/mpl/insert_fwd.hpp +++ /dev/null @@ -1,24 +0,0 @@ - -#ifndef BOOST_MPL_INSERT_FWD_HPP_INCLUDED -#define BOOST_MPL_INSERT_FWD_HPP_INCLUDED - -// Copyright Aleksey Gurtovoy 2000-2004 -// -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org/libs/mpl for documentation. - -// $Id$ -// $Date$ -// $Revision$ - -namespace boost { namespace mpl { - -template< typename Tag > struct insert_impl; -template< typename Sequence, typename Pos_or_T, typename T > struct insert; - -}} - -#endif // BOOST_MPL_INSERT_FWD_HPP_INCLUDED diff --git a/3rdparty/boost/boost/mpl/insert_range.hpp b/3rdparty/boost/boost/mpl/insert_range.hpp deleted file mode 100644 index 0c362f5ae1..0000000000 --- a/3rdparty/boost/boost/mpl/insert_range.hpp +++ /dev/null @@ -1,41 +0,0 @@ - -#ifndef BOOST_MPL_INSERT_RANGE_HPP_INCLUDED -#define BOOST_MPL_INSERT_RANGE_HPP_INCLUDED - -// Copyright Aleksey Gurtovoy 2000-2004 -// -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org/libs/mpl for documentation. - -// $Id$ -// $Date$ -// $Revision$ - -#include -#include -#include -#include -#include - -namespace boost { namespace mpl { - -template< - typename BOOST_MPL_AUX_NA_PARAM(Sequence) - , typename BOOST_MPL_AUX_NA_PARAM(Pos) - , typename BOOST_MPL_AUX_NA_PARAM(Range) - > -struct insert_range - : insert_range_impl< typename sequence_tag::type > - ::template apply< Sequence,Pos,Range > -{ - BOOST_MPL_AUX_LAMBDA_SUPPORT(3,insert_range,(Sequence,Pos,Range)) -}; - -BOOST_MPL_AUX_NA_SPEC(3, insert_range) - -}} - -#endif // BOOST_MPL_INSERT_RANGE_HPP_INCLUDED diff --git a/3rdparty/boost/boost/mpl/insert_range_fwd.hpp b/3rdparty/boost/boost/mpl/insert_range_fwd.hpp deleted file mode 100644 index d9c946f2a9..0000000000 --- a/3rdparty/boost/boost/mpl/insert_range_fwd.hpp +++ /dev/null @@ -1,24 +0,0 @@ - -#ifndef BOOST_MPL_INSERT_RANGE_FWD_HPP_INCLUDED -#define BOOST_MPL_INSERT_RANGE_FWD_HPP_INCLUDED - -// Copyright Aleksey Gurtovoy 2000-2004 -// -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org/libs/mpl for documentation. - -// $Id$ -// $Date$ -// $Revision$ - -namespace boost { namespace mpl { - -template< typename Tag > struct insert_range_impl; -template< typename Sequence, typename Pos, typename Range > struct insert_range; - -}} - -#endif // BOOST_MPL_INSERT_RANGE_FWD_HPP_INCLUDED diff --git a/3rdparty/boost/boost/mpl/joint_view.hpp b/3rdparty/boost/boost/mpl/joint_view.hpp deleted file mode 100644 index cd9cddac7e..0000000000 --- a/3rdparty/boost/boost/mpl/joint_view.hpp +++ /dev/null @@ -1,65 +0,0 @@ - -#ifndef BOOST_MPL_JOINT_VIEW_HPP_INCLUDED -#define BOOST_MPL_JOINT_VIEW_HPP_INCLUDED - -// Copyright Aleksey Gurtovoy 2000-2004 -// -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org/libs/mpl for documentation. - -// $Id$ -// $Date$ -// $Revision$ - -#include -#include -#include -#include -#include - -namespace boost { namespace mpl { - -namespace aux { -struct joint_view_tag; -} - -template<> -struct size_impl< aux::joint_view_tag > -{ - template < typename JointView > struct apply - : plus< - size - , size - > - {}; -}; - -template< - typename BOOST_MPL_AUX_NA_PARAM(Sequence1_) - , typename BOOST_MPL_AUX_NA_PARAM(Sequence2_) - > -struct joint_view -{ - typedef typename mpl::begin::type first1_; - typedef typename mpl::end::type last1_; - typedef typename mpl::begin::type first2_; - typedef typename mpl::end::type last2_; - - // agurt, 25/may/03: for the 'size_traits' implementation above - typedef Sequence1_ sequence1_; - typedef Sequence2_ sequence2_; - - typedef joint_view type; - typedef aux::joint_view_tag tag; - typedef joint_iter begin; - typedef joint_iter end; -}; - -BOOST_MPL_AUX_NA_SPEC(2, joint_view) - -}} - -#endif // BOOST_MPL_JOINT_VIEW_HPP_INCLUDED diff --git a/3rdparty/boost/boost/mpl/limits/string.hpp b/3rdparty/boost/boost/mpl/limits/string.hpp deleted file mode 100644 index eb85aa389f..0000000000 --- a/3rdparty/boost/boost/mpl/limits/string.hpp +++ /dev/null @@ -1,21 +0,0 @@ - -#ifndef BOOST_MPL_LIMITS_STRING_HPP_INCLUDED -#define BOOST_MPL_LIMITS_STRING_HPP_INCLUDED - -// Copyright Eric Niebler 2009 -// -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org/libs/mpl for documentation. - -// $Id: string.hpp 49239 2009-04-01 09:10:26Z eric_niebler $ -// $Date: 2009-04-01 02:10:26 -0700 (Wed, 1 Apr 2009) $ -// $Revision: 49239 $ - -#if !defined(BOOST_MPL_LIMIT_STRING_SIZE) -# define BOOST_MPL_LIMIT_STRING_SIZE 32 -#endif - -#endif // BOOST_MPL_LIMITS_STRING_HPP_INCLUDED diff --git a/3rdparty/boost/boost/mpl/string.hpp b/3rdparty/boost/boost/mpl/string.hpp deleted file mode 100644 index e7898562df..0000000000 --- a/3rdparty/boost/boost/mpl/string.hpp +++ /dev/null @@ -1,607 +0,0 @@ - -#ifndef BOOST_MPL_STRING_HPP_INCLUDED -#define BOOST_MPL_STRING_HPP_INCLUDED - -// Copyright Eric Niebler 2009 -// -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org/libs/mpl for documentation. - -// $Id: string.hpp 49239 2009-04-01 09:10:26Z eric_niebler $ -// $Date: 2009-04-01 02:10:26 -0700 (Wed, 1 Apr 2009) $ -// $Revision: 49239 $ -// -// Thanks to: -// Dmitry Goncharov for porting this to the Sun compiler - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include // for bidirectional_iterator_tag -#include - -namespace boost { namespace mpl -{ - #define BOOST_MPL_STRING_MAX_PARAMS \ - BOOST_PP_DIV(BOOST_PP_ADD(BOOST_MPL_LIMIT_STRING_SIZE, 3), 4) - - // Low-level bit-twiddling is done by macros. Any implementation-defined behavior of - // multi-character literals should be localized to these macros. - - #define BOOST_MPL_MULTICHAR_LENGTH(c) \ - (std::size_t)((c0xffffff)+(c>0xffff)+(c>0xff)+1)) - - #if BOOST_ENDIAN_LITTLE_BYTE && defined(__SUNPRO_CC) - - #define BOOST_MPL_MULTICHAR_AT(c,i) \ - (char)(0xff&((unsigned)(c)>>(8*(std::size_t)(i)))) - - #define BOOST_MPL_MULTICHAR_PUSH_BACK(c,i) \ - ((((unsigned char)(i))<<(BOOST_MPL_MULTICHAR_LENGTH(c)*8))|(unsigned)(c)) - - #define BOOST_MPL_MULTICHAR_PUSH_FRONT(c,i) \ - (((unsigned)(c)<<8)|(unsigned char)(i)) - - #define BOOST_MPL_MULTICHAR_POP_BACK(c) \ - (((1<<((BOOST_MPL_MULTICHAR_LENGTH(c)-1)*8))-1)&(unsigned)(c)) - - #define BOOST_MPL_MULTICHAR_POP_FRONT(c) \ - ((unsigned)(c)>>8) - - #else - - #define BOOST_MPL_MULTICHAR_AT(c,i) \ - (char)(0xff&((unsigned)(c)>>(8*(BOOST_MPL_MULTICHAR_LENGTH(c)-(std::size_t)(i)-1)))) - - #define BOOST_MPL_MULTICHAR_PUSH_BACK(c,i) \ - (((unsigned)(c)<<8)|(unsigned char)(i)) - - #define BOOST_MPL_MULTICHAR_PUSH_FRONT(c,i) \ - ((((unsigned char)(i))<<(BOOST_MPL_MULTICHAR_LENGTH(c)*8))|(unsigned)(c)) - - #define BOOST_MPL_MULTICHAR_POP_BACK(c) \ - ((unsigned)(c)>>8) - - #define BOOST_MPL_MULTICHAR_POP_FRONT(c) \ - (((1<<((BOOST_MPL_MULTICHAR_LENGTH(c)-1)*8))-1)&(unsigned)(c)) - - #endif - - struct string_tag; - struct string_iterator_tag; - - template - struct string; - - template - struct string_iterator; - - template - struct sequence_tag; - - template - struct size_impl; - - template<> - struct size_impl - { - template - struct apply; - - #define M0(z, n, data) \ - + BOOST_MPL_MULTICHAR_LENGTH(BOOST_PP_CAT(C,n)) - - #define M1(z, n, data) \ - template \ - struct apply > \ - : mpl::size_t<(0 BOOST_PP_REPEAT_ ## z(n, M0, ~))> \ - {}; - - BOOST_PP_REPEAT_FROM_TO(1, BOOST_PP_INC(BOOST_MPL_STRING_MAX_PARAMS), M1, ~) - #undef M0 - #undef M1 - }; - - template<> - struct size_impl::apply > - : mpl::size_t<0> - {}; - - template - struct begin_impl; - - template<> - struct begin_impl - { - template - struct apply - { - typedef mpl::string_iterator type; - }; - }; - - template - struct end_impl; - - template<> - struct end_impl - { - template - struct apply; - - #define M0(z,n,data) \ - template \ - struct apply > \ - { \ - typedef mpl::string_iterator, n, 0> type; \ - }; - - BOOST_PP_REPEAT_FROM_TO(1, BOOST_PP_INC(BOOST_MPL_STRING_MAX_PARAMS), M0, ~) - #undef M0 - }; - - template<> - struct end_impl::apply > - { - typedef mpl::string_iterator, 0, 0> type; - }; - - template - struct push_back_impl; - - template<> - struct push_back_impl - { - template - struct apply - { - BOOST_MPL_ASSERT_MSG( - (BOOST_MPL_LIMIT_STRING_SIZE != mpl::size::type::value) - , PUSH_BACK_FAILED_MPL_STRING_IS_FULL - , (Sequence) - ); - // If the above assertion didn't fire, then the string is sparse. - // Repack the string and retry the push_back - typedef - typename mpl::push_back< - typename mpl::copy< - Sequence - , mpl::back_inserter > - >::type - , Value - >::type - type; - }; - - template - struct apply, Value, false> - { - typedef mpl::string<(char)Value::value> type; - }; - - #define M0(z,n,data) \ - template \ - struct apply, Value, false> \ - { \ - typedef \ - mpl::string< \ - BOOST_PP_ENUM_PARAMS_Z(z, BOOST_PP_DEC(n), C) \ - BOOST_PP_COMMA_IF(BOOST_PP_DEC(n)) \ - ((unsigned)BOOST_PP_CAT(C,BOOST_PP_DEC(n))>0xffffff) \ - ?BOOST_PP_CAT(C,BOOST_PP_DEC(n)) \ - :BOOST_MPL_MULTICHAR_PUSH_BACK(BOOST_PP_CAT(C,BOOST_PP_DEC(n)), Value::value) \ - , ((unsigned)BOOST_PP_CAT(C,BOOST_PP_DEC(n))>0xffffff) \ - ?(char)Value::value \ - :0 \ - > \ - type; \ - }; - - BOOST_PP_REPEAT_FROM_TO(1, BOOST_MPL_STRING_MAX_PARAMS, M0, ~) - #undef M0 - - template - struct apply, Value, false> - { - typedef - mpl::string< - BOOST_PP_ENUM_PARAMS(BOOST_PP_DEC(BOOST_MPL_STRING_MAX_PARAMS), C) - , BOOST_MPL_MULTICHAR_PUSH_BACK(BOOST_PP_CAT(C,BOOST_PP_DEC(BOOST_MPL_STRING_MAX_PARAMS)), Value::value) - > - type; - }; - }; - - template - struct has_push_back_impl; - - template<> - struct has_push_back_impl - { - template - struct apply - : mpl::true_ - {}; - }; - - template - struct pop_back_impl; - - template<> - struct pop_back_impl - { - template - struct apply; - - #define M0(z,n,data) \ - template \ - struct apply > \ - { \ - BOOST_MPL_ASSERT_MSG((C0 != 0), POP_BACK_FAILED_MPL_STRING_IS_EMPTY, (mpl::string<>)); \ - typedef \ - mpl::string< \ - BOOST_PP_ENUM_PARAMS_Z(z, BOOST_PP_DEC(n), C) \ - BOOST_PP_COMMA_IF(BOOST_PP_DEC(n)) \ - BOOST_MPL_MULTICHAR_POP_BACK(BOOST_PP_CAT(C,BOOST_PP_DEC(n))) \ - > \ - type; \ - }; - - BOOST_PP_REPEAT_FROM_TO(1, BOOST_PP_INC(BOOST_MPL_STRING_MAX_PARAMS), M0, ~) - #undef M0 - }; - - template - struct has_pop_back_impl; - - template<> - struct has_pop_back_impl - { - template - struct apply - : mpl::true_ - {}; - }; - - template - struct push_front_impl; - - template<> - struct push_front_impl - { - template - struct apply - { - BOOST_MPL_ASSERT_MSG( - (BOOST_MPL_LIMIT_STRING_SIZE != mpl::size::type::value) - , PUSH_FRONT_FAILED_MPL_STRING_IS_FULL - , (Sequence) - ); - // If the above assertion didn't fire, then the string is sparse. - // Repack the string and retry the push_front. - typedef - typename mpl::push_front< - typename mpl::reverse_copy< - Sequence - , mpl::front_inserter > - >::type - , Value - >::type - type; - }; - - #if !BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590)) - template - struct apply, Value, false> - { - typedef mpl::string<(char)Value::value> type; - }; - #endif - - #define M0(z,n,data) \ - template \ - struct apply, Value, true> \ - { \ - typedef \ - mpl::string< \ - (char)Value::value \ - BOOST_PP_ENUM_TRAILING_PARAMS_Z(z, n, C) \ - > \ - type; \ - }; - - BOOST_PP_REPEAT_FROM_TO(1, BOOST_MPL_STRING_MAX_PARAMS, M0, ~) - #undef M0 - - template - struct apply, Value, false> - { - typedef - mpl::string< - BOOST_MPL_MULTICHAR_PUSH_FRONT(C0, Value::value) - , BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, C) - > - type0; - - #if BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590)) - typedef - typename mpl::if_< - mpl::empty > - , mpl::string<(char)Value::value> - , type0 - >::type - type; - #else - typedef type0 type; - #endif - }; - }; - - template - struct has_push_front_impl; - - template<> - struct has_push_front_impl - { - template - struct apply - : mpl::true_ - {}; - }; - - template - struct pop_front_impl; - - template<> - struct pop_front_impl - { - template - struct apply; - - #define M0(z,n,data) \ - template \ - struct apply, true> \ - { \ - BOOST_MPL_ASSERT_MSG((C0 != 0), POP_FRONT_FAILED_MPL_STRING_IS_EMPTY, (mpl::string<>)); \ - typedef \ - mpl::string \ - type; \ - }; - - BOOST_PP_REPEAT_FROM_TO(1, BOOST_MPL_STRING_MAX_PARAMS, M0, ~) - #undef M0 - - template - struct apply, false> - { - typedef - mpl::string< - BOOST_MPL_MULTICHAR_POP_FRONT(C0) - , BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, C) - > - type; - }; - }; - - template - struct has_pop_front_impl; - - template<> - struct has_pop_front_impl - { - template - struct apply - : mpl::true_ - {}; - }; - - template - struct insert_range_impl; - - template<> - struct insert_range_impl - { - template - struct apply - : mpl::copy< - mpl::joint_view< - mpl::iterator_range< - mpl::string_iterator - , Pos - > - , mpl::joint_view< - Range - , mpl::iterator_range< - Pos - , typename mpl::end::type - > - > - > - , mpl::back_inserter > - > - {}; - }; - - template - struct insert_impl; - - template<> - struct insert_impl - { - template - struct apply - : mpl::insert_range > - {}; - }; - - template - struct erase_impl; - - template<> - struct erase_impl - { - template - struct apply - : mpl::copy< - mpl::joint_view< - mpl::iterator_range< - mpl::string_iterator - , First - > - , mpl::iterator_range< - typename mpl::if_na::type>::type - , typename mpl::end::type - > - > - , mpl::back_inserter > - > - {}; - }; - - template - struct clear_impl; - - template<> - struct clear_impl - { - template - struct apply - { - typedef mpl::string<> type; - }; - }; - - #define M0(z, n, data) \ - template \ - struct string_iterator, n, J> \ - { \ - enum { eomc_ = (BOOST_MPL_MULTICHAR_LENGTH(BOOST_PP_CAT(C, n)) == J + 1) }; \ - typedef mpl::string string; \ - typedef std::bidirectional_iterator_tag category; \ - typedef \ - mpl::string_iterator \ - next; \ - typedef \ - mpl::string_iterator \ - prior; \ - typedef mpl::char_ type; \ - }; \ - template \ - struct string_iterator, n, 0> \ - { \ - enum { eomc_ = (BOOST_MPL_MULTICHAR_LENGTH(BOOST_PP_CAT(C, n)) == 1) }; \ - typedef mpl::string string; \ - typedef std::bidirectional_iterator_tag category; \ - typedef \ - mpl::string_iterator \ - next; \ - typedef \ - mpl::string_iterator< \ - string \ - , n - 1 \ - , BOOST_MPL_MULTICHAR_LENGTH(BOOST_PP_CAT(C, BOOST_PP_DEC(n))) - 1 \ - > \ - prior; \ - typedef mpl::char_ type; \ - }; - - BOOST_PP_REPEAT(BOOST_MPL_STRING_MAX_PARAMS, M0, ~) - #undef M0 - - template - struct string - { - /// INTERNAL ONLY - enum - { - front_ = C0 - , back_ = BOOST_PP_CAT(C, BOOST_PP_DEC(BOOST_MPL_STRING_MAX_PARAMS)) - }; - - typedef char value_type; - typedef string type; - typedef string_tag tag; - }; - - namespace aux_ - { - template - struct next_unless - : mpl::next - {}; - - template - struct next_unless - { - typedef End type; - }; - - template - struct deref_unless - : mpl::deref - {}; - - template - struct deref_unless - { - typedef mpl::char_<'\0'> type; - }; - } - - template - struct c_str - { - typedef typename mpl::end::type iend; - typedef typename mpl::begin::type i0; - #define M0(z, n, data) \ - typedef \ - typename mpl::aux_::next_unless::type \ - BOOST_PP_CAT(i, BOOST_PP_INC(n)); - BOOST_PP_REPEAT(BOOST_MPL_LIMIT_STRING_SIZE, M0, ~) - #undef M0 - - typedef c_str type; - static typename Sequence::value_type const value[BOOST_MPL_LIMIT_STRING_SIZE+1]; - }; - - template - typename Sequence::value_type const c_str::value[BOOST_MPL_LIMIT_STRING_SIZE+1] = - { - #define M0(z, n, data) \ - mpl::aux_::deref_unless::type::value, - BOOST_PP_REPEAT(BOOST_MPL_LIMIT_STRING_SIZE, M0, ~) - #undef M0 - '\0' - }; - -}} // namespace boost - -#endif // BOOST_MPL_STRING_HPP_INCLUDED diff --git a/3rdparty/boost/boost/preprocessor/arithmetic/div.hpp b/3rdparty/boost/boost/preprocessor/arithmetic/div.hpp deleted file mode 100644 index 277596cea9..0000000000 --- a/3rdparty/boost/boost/preprocessor/arithmetic/div.hpp +++ /dev/null @@ -1,39 +0,0 @@ -# /* Copyright (C) 2001 -# * Housemarque Oy -# * http://www.housemarque.com -# * -# * Distributed under the Boost Software License, Version 1.0. (See -# * accompanying file LICENSE_1_0.txt or copy at -# * http://www.boost.org/LICENSE_1_0.txt) -# */ -# -# /* Revised by Paul Mensonides (2002) */ -# -# /* See http://www.boost.org for most recent version. */ -# -# ifndef BOOST_PREPROCESSOR_ARITHMETIC_DIV_HPP -# define BOOST_PREPROCESSOR_ARITHMETIC_DIV_HPP -# -# include -# include -# include -# -# /* BOOST_PP_DIV */ -# -# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG() -# define BOOST_PP_DIV(x, y) BOOST_PP_TUPLE_ELEM(3, 0, BOOST_PP_DIV_BASE(x, y)) -# else -# define BOOST_PP_DIV(x, y) BOOST_PP_DIV_I(x, y) -# define BOOST_PP_DIV_I(x, y) BOOST_PP_TUPLE_ELEM(3, 0, BOOST_PP_DIV_BASE(x, y)) -# endif -# -# /* BOOST_PP_DIV_D */ -# -# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG() -# define BOOST_PP_DIV_D(d, x, y) BOOST_PP_TUPLE_ELEM(3, 0, BOOST_PP_DIV_BASE_D(d, x, y)) -# else -# define BOOST_PP_DIV_D(d, x, y) BOOST_PP_DIV_D_I(d, x, y) -# define BOOST_PP_DIV_D_I(d, x, y) BOOST_PP_TUPLE_ELEM(3, 0, BOOST_PP_DIV_BASE_D(d, x, y)) -# endif -# -# endif diff --git a/3rdparty/boost/boost/type_traits/same_traits.hpp b/3rdparty/boost/boost/type_traits/same_traits.hpp deleted file mode 100644 index dab7dac783..0000000000 --- a/3rdparty/boost/boost/type_traits/same_traits.hpp +++ /dev/null @@ -1,15 +0,0 @@ -// (C) Copyright Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/type_traits for most recent version including documentation. -// -// defines is_same: - -#ifndef BOOST_TT_SAME_TRAITS_HPP_INCLUDED -#define BOOST_TT_SAME_TRAITS_HPP_INCLUDED - -#include - -#endif // BOOST_TT_SAME_TRAITS_HPP_INCLUDED diff --git a/3rdparty/boost/extract.sh b/3rdparty/boost/extract.sh index 879a92634a..f37448456b 100755 --- a/3rdparty/boost/extract.sh +++ b/3rdparty/boost/extract.sh @@ -37,10 +37,6 @@ bcp --boost=$1 \ boost/signals/connection.hpp \ boost/signals/trackable.hpp \ boost/tuple/tuple.hpp \ - boost/mpl/string.hpp \ - boost/mpl/fold.hpp \ - boost/mpl/size_t.hpp \ - boost/functional/hash.hpp \ \ needed diff --git a/src/Text.cpp b/src/Text.cpp index 416a67bf0d..f51646e55e 100644 --- a/src/Text.cpp +++ b/src/Text.cpp @@ -73,30 +73,6 @@ #include -// TODO: replace if in Text::readParToken() with compile time switch -#if 0 - -#include "support/metahash.h" - -typedef boost::mpl::string<'\\end','_lay','out'> end_layout; -typedef boost::mpl::string<'\\end','in','set'> end_inset; - -void foo() -{ - std::string token = "\\end_layout"; - - switch (boost::hash_value(token)) { - case lyx::support::hash_string::value: - return; - case lyx::support::hash_string::value: - return; - default: ; - }; - -} -#endif - - using namespace std; using namespace lyx::support; diff --git a/src/support/metahash.h b/src/support/metahash.h deleted file mode 100644 index 84f6062bc2..0000000000 --- a/src/support/metahash.h +++ /dev/null @@ -1,73 +0,0 @@ -// -*- C++ -*- -/** - * \file methash.h - * This file is part of LyX, the document processor. - * Licence details can be found in the file COPYING. - * - * \author Peter Kümmel - * - * Full author contact details are available in file CREDITS. - * - * Code by Tor Brede Vekterli - * http://arcticinteractive.com/2009/04/18/compile-time-string-hashing-boost-mpl/ - * (Boost 1.0 license.) - * - */ - -#ifndef LYX_META_HASH_H -#define LYX_META_HASH_H - -#include -#include -#include -#include - - - -namespace lyx { -namespace support { - -#ifdef _MSC_VER -#pragma warning(push) -// disable addition overflow warning -#pragma warning(disable:4307) -#endif - - template - struct hash_combine - { - typedef boost::mpl::size_t< - Seed::value ^ (static_cast(Value::value) - + 0x9e3779b9 + (Seed::value << 6) + (Seed::value >> 2)) - > type; - }; - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - - // Hash any sequence of integral wrapper types - template - struct hash_sequence - : boost::mpl::fold< - Sequence - , boost::mpl::size_t<0> - , hash_combine - >::type - {}; - - // For hashing std::strings et al that don't include the zero-terminator - template - struct hash_string : hash_sequence - {}; - - // Hash including terminating zero for char arrays - template - struct hash_cstring - : hash_combine< hash_sequence, boost::mpl::size_t<0> >::type - {}; - -} -} - -#endif From d0a318c7420a7150f6246afd11e75c125a11f0f9 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Fri, 20 May 2016 10:19:02 +0200 Subject: [PATCH 54/76] We do not use anymore The code using it was removed at 81959251. --- 3rdparty/boost/extract.sh | 1 - src/support/FileName.cpp | 1 - 2 files changed, 2 deletions(-) diff --git a/3rdparty/boost/extract.sh b/3rdparty/boost/extract.sh index f37448456b..e1ba8faafe 100755 --- a/3rdparty/boost/extract.sh +++ b/3rdparty/boost/extract.sh @@ -30,7 +30,6 @@ bcp --boost=$1 \ boost/lexical_cast.hpp \ boost/noncopyable.hpp \ boost/regex.hpp \ - boost/scoped_array.hpp \ boost/scoped_ptr.hpp \ boost/shared_ptr.hpp \ boost/signal.hpp \ diff --git a/src/support/FileName.cpp b/src/support/FileName.cpp index 6d40687a25..929c4165be 100644 --- a/src/support/FileName.cpp +++ b/src/support/FileName.cpp @@ -31,7 +31,6 @@ #include #include -#include #include #include From 4fb8e9b6393ad5fe5af12cfcdd18a62b11e032b6 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Sun, 28 Feb 2016 16:23:43 +0100 Subject: [PATCH 55/76] Use isMainText() instead of doing explicit tests --- src/TextMetrics.cpp | 7 +++---- src/TextMetrics.h | 3 +-- src/insets/InsetText.cpp | 6 +++--- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp index fdf0da6926..39eb2d441b 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -200,13 +200,13 @@ bool TextMetrics::metrics(MetricsInfo & mi, Dimension & dim, int min_width) int TextMetrics::rightMargin(ParagraphMetrics const & pm) const { - return main_text_? pm.rightMargin(*bv_) : 0; + return text_->isMainText() ? pm.rightMargin(*bv_) : 0; } int TextMetrics::rightMargin(pit_type const pit) const { - return main_text_? par_metrics_[pit].rightMargin(*bv_) : 0; + return text_->isMainText() ? par_metrics_[pit].rightMargin(*bv_) : 0; } @@ -353,7 +353,6 @@ bool TextMetrics::redoParagraph(pit_type const pit) pm.reset(par); Buffer & buffer = bv_->buffer(); - main_text_ = (text_ == &buffer.text()); bool changed = false; // Check whether there are InsetBibItems that need fixing @@ -1087,7 +1086,7 @@ void TextMetrics::setRowHeight(Row & row, pit_type const pit, // following code in another method specially tailored for the // main Text. The following test is thus bogus. // Top and bottom margin of the document (only at top-level) - if (main_text_ && topBottomSpace) { + if (text_->isMainText() && topBottomSpace) { if (pit == 0 && row.pos() == 0) maxasc += 20; if (pit + 1 == pit_type(pars.size()) && diff --git a/src/TextMetrics.h b/src/TextMetrics.h index 6f5cf68733..507213a5ab 100644 --- a/src/TextMetrics.h +++ b/src/TextMetrics.h @@ -35,7 +35,7 @@ class TextMetrics { public: /// Default constructor (only here for STL containers). - TextMetrics() : bv_(0), text_(0), main_text_(false), max_width_(0) {} + TextMetrics() : bv_(0), text_(0), max_width_(0) {} /// The only useful constructor. TextMetrics(BufferView *, Text *); @@ -243,7 +243,6 @@ private: /// \todo FIXME: this should be const. Text * text_; - bool main_text_; /// A map from paragraph index number to paragraph metrics typedef std::map ParMetricsCache; /// diff --git a/src/insets/InsetText.cpp b/src/insets/InsetText.cpp index 660826309f..017e1445d0 100644 --- a/src/insets/InsetText.cpp +++ b/src/insets/InsetText.cpp @@ -290,7 +290,7 @@ void InsetText::doDispatch(Cursor & cur, FuncRequest & cmd) break; case LFUN_INSET_DISSOLVE: { - bool const main_inset = &buffer().inset() == this; + bool const main_inset = text_.isMainText(); bool const target_inset = cmd.argument().empty() || cmd.getArg(0) == insetName(lyxCode()); // cur.inset() is the tabular when this is a single cell (bug #9954) @@ -323,7 +323,7 @@ bool InsetText::getStatus(Cursor & cur, FuncRequest const & cmd, { switch (cmd.action()) { case LFUN_INSET_DISSOLVE: { - bool const main_inset = &buffer().inset() == this; + bool const main_inset = text_.isMainText(); bool const target_inset = cmd.argument().empty() || cmd.getArg(0) == insetName(lyxCode()); // cur.inset() is the tabular when this is a single cell (bug #9954) @@ -340,7 +340,7 @@ bool InsetText::getStatus(Cursor & cur, FuncRequest const & cmd, status.setEnabled(false); return true; } - if (&buffer().inset() == this || !cur.paragraph().layout().args().empty()) + if (text_.isMainText() || !cur.paragraph().layout().args().empty()) return text_.getStatus(cur, cmd, status); Layout::LaTeXArgMap args = getLayout().args(); From e52a83549db311883d93dff4595ead7622dbfa75 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Sun, 28 Feb 2016 16:34:33 +0100 Subject: [PATCH 56/76] Remove unused TextMetrics::maxWidth() --- src/TextMetrics.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/TextMetrics.h b/src/TextMetrics.h index 507213a5ab..eef00ffd4d 100644 --- a/src/TextMetrics.h +++ b/src/TextMetrics.h @@ -104,9 +104,6 @@ public: /// current text height. int height() const { return dim_.height(); } - /// - int maxWidth() const { return max_width_; } - /// int rightMargin(ParagraphMetrics const & pm) const; int rightMargin(pit_type const pit) const; From 5792606ff96cba6e7c8741e7bfc9024463cd21f8 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Sun, 28 Feb 2016 16:42:35 +0100 Subject: [PATCH 57/76] Directly pass a Row::Element to RowPainter::paintInset --- src/RowPainter.cpp | 32 +++++++++++++++----------------- src/RowPainter.h | 3 +-- 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/RowPainter.cpp b/src/RowPainter.cpp index 8c62926889..276664237f 100644 --- a/src/RowPainter.cpp +++ b/src/RowPainter.cpp @@ -104,42 +104,40 @@ FontInfo RowPainter::labelFont() const // This draws green lines around each inset. -void RowPainter::paintInset(Inset const * inset, Font const & font, - Change const & change, - pos_type const pos) +void RowPainter::paintInset(Row::Element const & e) { // Handle selection bool const pi_selected = pi_.selected; Cursor const & cur = pi_.base.bv->cursor(); if (cur.selection() && cur.text() == &text_ && cur.normalAnchor().text() == &text_) - pi_.selected = row_.sel_beg <= pos && row_.sel_end > pos; + pi_.selected = row_.sel_beg <= e.pos && row_.sel_end > e.pos; - LASSERT(inset, return); + LASSERT(e.inset, return); // Backup full_repaint status because some insets (InsetTabular) // requires a full repaint bool const pi_full_repaint = pi_.full_repaint; bool const pi_do_spellcheck = pi_.do_spellcheck; Change const pi_change = pi_.change_; - pi_.base.font = inset->inheritFont() ? font.fontInfo() : + pi_.base.font = e.inset->inheritFont() ? e.font.fontInfo() : pi_.base.bv->buffer().params().getFont().fontInfo(); - pi_.ltr_pos = !font.isVisibleRightToLeft(); - pi_.change_ = change_.changed() ? change_ : change; - pi_.do_spellcheck &= inset->allowSpellCheck(); + pi_.ltr_pos = !e.font.isVisibleRightToLeft(); + pi_.change_ = change_.changed() ? change_ : e.change; + pi_.do_spellcheck &= e.inset->allowSpellCheck(); int const x1 = int(x_); - pi_.base.bv->coordCache().insets().add(inset, x1, yo_); + pi_.base.bv->coordCache().insets().add(e.inset, x1, yo_); // insets are painted completely. Recursive // FIXME: it is wrong to completely paint the background // if we want to do single row painting. - inset->drawBackground(pi_, x1, yo_); - inset->drawSelection(pi_, x1, yo_); - inset->draw(pi_, x1, yo_); + e.inset->drawBackground(pi_, x1, yo_); + e.inset->drawSelection(pi_, x1, yo_); + e.inset->draw(pi_, x1, yo_); - Dimension const & dim = pi_.base.bv->coordCache().insets().dim(inset); + Dimension const & dim = pi_.base.bv->coordCache().insets().dim(e.inset); - paintForeignMark(x_, font.language(), dim.descent()); + paintForeignMark(x_, e.font.language(), dim.descent()); x_ += dim.width(); @@ -587,7 +585,7 @@ void RowPainter::paintOnlyInsets() x_ += e.full_width(); continue; } - paintInset(e.inset, e.font, e.change, e.pos); + paintInset(e); } else x_ += e.full_width(); } @@ -615,7 +613,7 @@ void RowPainter::paintText() case Row::INSET: { // If outer row has changed, nested insets are repaint completely. pi_.base.bv->coordCache().insets().add(e.inset, int(x_), yo_); - paintInset(e.inset, e.font, e.change, e.pos); + paintInset(e); foreign_descent = e.dim.descent(); } break; diff --git a/src/RowPainter.h b/src/RowPainter.h index a4120e6dfd..cb70f5d8a9 100644 --- a/src/RowPainter.h +++ b/src/RowPainter.h @@ -64,8 +64,7 @@ private: void paintMisspelledMark(double orig_x, Row::Element const & e) const; void paintChange(double orig_x , Font const & font, Change const & change) const; void paintAppendixStart(int y) const; - void paintInset(Inset const * inset, Font const & font, - Change const & change, pos_type const pos); + void paintInset(Row::Element const & e); /// return the label font for this row FontInfo labelFont() const; From 171fe0cb430c7045d35873a222a07c11adcfdea8 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Sun, 28 Feb 2016 16:44:00 +0100 Subject: [PATCH 58/76] Remove unused CursorData::logicalpos_ This was introduced in 41ecabf5, probably by mistake. --- src/Cursor.cpp | 6 +++--- src/Cursor.h | 5 ----- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/Cursor.cpp b/src/Cursor.cpp index 1f84f45fea..a0a200fec5 100644 --- a/src/Cursor.cpp +++ b/src/Cursor.cpp @@ -239,7 +239,7 @@ bool bruteFind3(Cursor & cur, int x, int y, bool up) CursorData::CursorData() : DocIterator(), anchor_(), selection_(false), mark_(false), word_selection_(false), - logicalpos_(false), current_font(inherit_font), + current_font(inherit_font), autocorrect_(false), macromode_(false) {} @@ -247,7 +247,7 @@ CursorData::CursorData() CursorData::CursorData(Buffer * buffer) : DocIterator(buffer), anchor_(), selection_(false), mark_(false), word_selection_(false), - logicalpos_(false), current_font(inherit_font), + current_font(inherit_font), autocorrect_(false), macromode_(false) {} @@ -255,7 +255,7 @@ CursorData::CursorData(Buffer * buffer) CursorData::CursorData(DocIterator const & dit) : DocIterator(dit), anchor_(), selection_(false), mark_(false), word_selection_(false), - logicalpos_(false), current_font(inherit_font), + current_font(inherit_font), autocorrect_(false), macromode_(false) {} diff --git a/src/Cursor.h b/src/Cursor.h index de2405692a..acec12772f 100644 --- a/src/Cursor.h +++ b/src/Cursor.h @@ -101,11 +101,6 @@ protected: bool mark_; /// are we in word-selection mode? This is set when double clicking. bool word_selection_; - /// If true, we are behind the previous char, otherwise we are in front - // of the next char. This only make a difference when we are in front - // of a big inset spanning a whole row and computing coordinates for - // displaying the cursor. - bool logicalpos_; // FIXME: make them protected. public: From 27bc2e4b6351e3b9520b1ede36aded2ea8b7cbdb Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Sun, 28 Feb 2016 16:48:11 +0100 Subject: [PATCH 59/76] Remove unused bruteFind* functions And rename bruteFind2 to bruteFind. --- src/Cursor.cpp | 124 +------------------------------------------------ 1 file changed, 2 insertions(+), 122 deletions(-) diff --git a/src/Cursor.cpp b/src/Cursor.cpp index a0a200fec5..6733aaedfa 100644 --- a/src/Cursor.cpp +++ b/src/Cursor.cpp @@ -66,7 +66,7 @@ namespace { // Find position closest to (x, y) in cell given by iter. // Used only in mathed -DocIterator bruteFind2(Cursor const & c, int x, int y) +DocIterator bruteFind(Cursor const & c, int x, int y) { double best_dist = numeric_limits::max(); @@ -113,126 +113,6 @@ DocIterator bruteFind2(Cursor const & c, int x, int y) } -/* -/// moves position closest to (x, y) in given box -bool bruteFind(Cursor & cursor, - int x, int y, int xlow, int xhigh, int ylow, int yhigh) -{ - LASSERT(!cursor.empty(), return false); - Inset & inset = cursor[0].inset(); - BufferView & bv = cursor.bv(); - - CoordCache::InnerParPosCache const & cache = - bv.coordCache().getParPos().find(cursor.bottom().text())->second; - // Get an iterator on the first paragraph in the cache - DocIterator it(inset); - it.push_back(CursorSlice(inset)); - it.pit() = cache.begin()->first; - // Get an iterator after the last paragraph in the cache - DocIterator et(inset); - et.push_back(CursorSlice(inset)); - et.pit() = prev(cache.end(), 1)->first; - if (et.pit() >= et.lastpit()) - et = doc_iterator_end(inset); - else - ++et.pit(); - - double best_dist = numeric_limits::max(); - DocIterator best_cursor = et; - - for ( ; it != et; it.forwardPos(true)) { - // avoid invalid nesting when selecting - if (!cursor.selection() || positionable(it, cursor.anchor_)) { - Point p = bv.getPos(it, false); - int xo = p.x_; - int yo = p.y_; - if (xlow <= xo && xo <= xhigh && ylow <= yo && yo <= yhigh) { - double const dx = xo - x; - double const dy = yo - y; - double const d = dx * dx + dy * dy; - // '<=' in order to take the last possible position - // this is important for clicking behind \sum in e.g. '\sum_i a' - if (d <= best_dist) { - // lyxerr << "*" << endl; - best_dist = d; - best_cursor = it; - } - } - } - } - - if (best_cursor != et) { - cursor.setCursor(best_cursor); - return true; - } - - return false; -} -*/ - -/* -/// moves position closest to (x, y) in given box -bool bruteFind3(Cursor & cur, int x, int y, bool up) -{ - BufferView & bv = cur.bv(); - int ylow = up ? 0 : y + 1; - int yhigh = up ? y - 1 : bv.workHeight(); - int xlow = 0; - int xhigh = bv.workWidth(); - -// FIXME: bit more work needed to get 'from' and 'to' right. - pit_type from = cur.bottom().pit(); - //pit_type to = cur.bottom().pit(); - //lyxerr << "Pit start: " << from << endl; - - //lyxerr << "bruteFind3: x: " << x << " y: " << y - // << " xlow: " << xlow << " xhigh: " << xhigh - // << " ylow: " << ylow << " yhigh: " << yhigh - // << endl; - DocIterator it = doc_iterator_begin(cur.buffer()); - it.pit() = from; - DocIterator et = doc_iterator_end(cur.buffer()); - - double best_dist = numeric_limits::max(); - DocIterator best_cursor = et; - - for ( ; it != et; it.forwardPos()) { - // avoid invalid nesting when selecting - if (bv.cursorStatus(it) == CUR_INSIDE - && (!cur.selection() || positionable(it, cur.realAnchor()))) { - // If this function is ever used again, check - // whether this is the same as "bv.getPos(it, - // false)" with boundary = false. - Point p = bv.getPos(it); - int xo = p.x_; - int yo = p.y_; - if (xlow <= xo && xo <= xhigh && ylow <= yo && yo <= yhigh) { - double const dx = xo - x; - double const dy = yo - y; - double const d = dx * dx + dy * dy; - //lyxerr << "itx: " << xo << " ity: " << yo << " d: " << d - // << " dx: " << dx << " dy: " << dy - // << " idx: " << it.idx() << " pos: " << it.pos() - // << " it:\n" << it - // << endl; - // '<=' in order to take the last possible position - // this is important for clicking behind \sum in e.g. '\sum_i a' - if (d <= best_dist) { - //lyxerr << "*" << endl; - best_dist = d; - best_cursor = it; - } - } - } - } - - //lyxerr << "best_dist: " << best_dist << " cur:\n" << best_cursor << endl; - if (best_cursor == et) - return false; - cur.setCursor(best_cursor); - return true; -} -*/ } // namespace anon @@ -1794,7 +1674,7 @@ bool Cursor::upDownInMath(bool up) //lyxerr << "idxUpDown triggered" << endl; // try to find best position within this inset if (!selection()) - setCursor(bruteFind2(*this, xo, yo)); + setCursor(bruteFind(*this, xo, yo)); return true; } From 700e480a18c5fd30dcb8b58bf136f0010f62a4d6 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Sun, 28 Feb 2016 16:56:00 +0100 Subject: [PATCH 60/76] Cleanup bruteFind. --- src/Cursor.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Cursor.cpp b/src/Cursor.cpp index 6733aaedfa..b4ca8e0c65 100644 --- a/src/Cursor.cpp +++ b/src/Cursor.cpp @@ -73,25 +73,25 @@ DocIterator bruteFind(Cursor const & c, int x, int y) DocIterator result; DocIterator it = c; - it.top().pos() = 0; + it.pos() = 0; DocIterator et = c; - et.top().pos() = et.top().asInsetMath()->cell(et.top().idx()).size(); + et.pos() = et.lastpos(); for (size_t i = 0;; ++i) { int xo; int yo; Inset const * inset = &it.inset(); - CoordCache const & cache = c.bv().coordCache(); + CoordCache::Insets const & insetCache = c.bv().coordCache().getInsets(); // FIXME: in the case where the inset is not in the cache, this // means that no part of it is visible on screen. In this case // we don't do elaborate search and we just return the forwarded // DocIterator at its beginning. - if (!cache.getInsets().has(inset)) { + if (!insetCache.has(inset)) { it.top().pos() = 0; return it; } - Point const o = cache.getInsets().xy(inset); + Point const o = insetCache.xy(inset); inset->cursorPos(c.bv(), it.top(), c.boundary(), xo, yo); // Convert to absolute xo += o.x_; From 641691bc123c479eaa4765a4ba0bb4fcaeee8f46 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Sun, 28 Feb 2016 17:01:01 +0100 Subject: [PATCH 61/76] TextMetrics: Use shorter names for font metrics This keeps code easier to read. --- src/TextMetrics.cpp | 57 +++++++++++++++++++++------------------------ 1 file changed, 27 insertions(+), 30 deletions(-) diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp index 39eb2d441b..6fb12b3734 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -951,15 +951,15 @@ void TextMetrics::setRowHeight(Row & row, pit_type const pit, FontInfo labelfont = text_->labelFont(par); - FontMetrics const & labelfont_metrics = theFontMetrics(labelfont); - FontMetrics const & fontmetrics = theFontMetrics(font); + FontMetrics const & lfm = theFontMetrics(labelfont); + FontMetrics const & fm = theFontMetrics(font); // these are minimum values double const spacing_val = layout.spacing.getValue() * text_->spacing(par); //lyxerr << "spacing_val = " << spacing_val << endl; - int maxasc = int(fontmetrics.maxAscent() * spacing_val); - int maxdesc = int(fontmetrics.maxDescent() * spacing_val); + int maxasc = int(fm.maxAscent() * spacing_val); + int maxdesc = int(fm.maxDescent() * spacing_val); // insets may be taller CoordCache::Insets const & insetCache = bv_->coordCache().getInsets(); @@ -1018,7 +1018,7 @@ void TextMetrics::setRowHeight(Row & row, pit_type const pit, && (!layout.isParagraphGroup() || text_->isFirstInSequence(pit)) && !par.labelString().empty()) { labeladdon = int( - labelfont_metrics.maxHeight() + lfm.maxHeight() * layout.spacing.getValue() * text_->spacing(par) + (layout.topsep + layout.labelbottomsep) * dh); @@ -1669,6 +1669,7 @@ int TextMetrics::leftMargin(int max_width, //lyxerr << "TextMetrics::leftMargin: pit: " << pit << " pos: " << pos << endl; DocumentClass const & tclass = buffer.params().documentClass(); Layout const & layout = par.layout(); + FontMetrics const & bfm = theFontMetrics(buffer.params().getFont()); docstring parindent = layout.parindent; @@ -1677,8 +1678,7 @@ int TextMetrics::leftMargin(int max_width, if (text_->isMainText()) l_margin += bv_->leftMargin(); - l_margin += theFontMetrics(buffer.params().getFont()).signedWidth( - tclass.leftmargin()); + l_margin += bfm.signedWidth(tclass.leftmargin()); int depth = par.getDepth(); if (depth != 0) { @@ -1696,8 +1696,7 @@ int TextMetrics::leftMargin(int max_width, buffer.params().paragraph_separation == BufferParams::ParagraphIndentSeparation) { docstring pi = pars[newpar].layout().parindent; - l_margin -= theFontMetrics( - buffer.params().getFont()).signedWidth(pi); + l_margin -= bfm.signedWidth(pi); } } if (tclass.isDefaultLayout(par.layout()) @@ -1726,37 +1725,36 @@ int TextMetrics::leftMargin(int max_width, } FontInfo const labelfont = text_->labelFont(par); - FontMetrics const & labelfont_metrics = theFontMetrics(labelfont); + FontMetrics const & lfm = theFontMetrics(labelfont); switch (layout.margintype) { case MARGIN_DYNAMIC: if (!layout.leftmargin.empty()) { - l_margin += theFontMetrics(buffer.params().getFont()).signedWidth( - layout.leftmargin); + l_margin += bfm.signedWidth(layout.leftmargin); } if (!par.labelString().empty()) { - l_margin += labelfont_metrics.signedWidth(layout.labelindent); - l_margin += labelfont_metrics.width(par.labelString()); - l_margin += labelfont_metrics.width(layout.labelsep); + l_margin += lfm.signedWidth(layout.labelindent); + l_margin += lfm.width(par.labelString()); + l_margin += lfm.width(layout.labelsep); } break; case MARGIN_MANUAL: { - l_margin += labelfont_metrics.signedWidth(layout.labelindent); + l_margin += lfm.signedWidth(layout.labelindent); // The width of an empty par, even with manual label, should be 0 if (!par.empty() && pos >= par.beginOfBody()) { if (!par.getLabelWidthString().empty()) { docstring labstr = par.getLabelWidthString(); - l_margin += labelfont_metrics.width(labstr); - l_margin += labelfont_metrics.width(layout.labelsep); + l_margin += lfm.width(labstr); + l_margin += lfm.width(layout.labelsep); } } break; } case MARGIN_STATIC: { - l_margin += theFontMetrics(buffer.params().getFont()). - signedWidth(layout.leftmargin) * 4 / (par.getDepth() + 4); + l_margin += bfm.signedWidth(layout.leftmargin) * 4 + / (par.getDepth() + 4); break; } @@ -1764,20 +1762,20 @@ int TextMetrics::leftMargin(int max_width, if (layout.labeltype == LABEL_MANUAL) { // if we are at position 0, we are never in the body if (pos > 0 && pos >= par.beginOfBody()) - l_margin += labelfont_metrics.signedWidth(layout.leftmargin); + l_margin += lfm.signedWidth(layout.leftmargin); else - l_margin += labelfont_metrics.signedWidth(layout.labelindent); + l_margin += lfm.signedWidth(layout.labelindent); } else if (pos != 0 // Special case to fix problems with // theorems (JMarc) || (layout.labeltype == LABEL_STATIC && layout.latextype == LATEX_ENVIRONMENT && !text_->isFirstInSequence(pit))) { - l_margin += labelfont_metrics.signedWidth(layout.leftmargin); + l_margin += lfm.signedWidth(layout.leftmargin); } else if (!layout.labelIsAbove()) { - l_margin += labelfont_metrics.signedWidth(layout.labelindent); - l_margin += labelfont_metrics.width(layout.labelsep); - l_margin += labelfont_metrics.width(par.labelString()); + l_margin += lfm.signedWidth(layout.labelindent); + l_margin += lfm.width(layout.labelsep); + l_margin += lfm.width(par.labelString()); } break; @@ -1794,7 +1792,7 @@ int TextMetrics::leftMargin(int max_width, for ( ; rit != end; ++rit) if (rit->fill() < minfill) minfill = rit->fill(); - l_margin += theFontMetrics(buffer.params().getFont()).signedWidth(layout.leftmargin); + l_margin += bfm.signedWidth(layout.leftmargin); l_margin += minfill; #endif // also wrong, but much shorter. @@ -1804,7 +1802,7 @@ int TextMetrics::leftMargin(int max_width, } if (!par.params().leftIndent().zero()) - l_margin += par.params().leftIndent().inPixels(max_width, labelfont_metrics.em()); + l_margin += par.params().leftIndent().inPixels(max_width, lfm.em()); LyXAlignment align; @@ -1838,8 +1836,7 @@ int TextMetrics::leftMargin(int max_width, // the indentation set in the document // settings if (buffer.params().getIndentation().asLyXCommand() == "default") - l_margin += theFontMetrics( - buffer.params().getFont()).signedWidth(parindent); + l_margin += bfm.signedWidth(parindent); else l_margin += buffer.params().getIndentation().inPixels(*bv_); } From 5739433feb441ae2f2af51e532bbbe2d2fe77103 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Sun, 28 Feb 2016 17:11:51 +0100 Subject: [PATCH 62/76] FindAndReplace: reorder includes --- src/frontends/qt4/FindAndReplace.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/frontends/qt4/FindAndReplace.cpp b/src/frontends/qt4/FindAndReplace.cpp index f40666c39b..ac7084a55b 100644 --- a/src/frontends/qt4/FindAndReplace.cpp +++ b/src/frontends/qt4/FindAndReplace.cpp @@ -12,23 +12,23 @@ #include "FindAndReplace.h" -#include "Lexer.h" #include "GuiApplication.h" #include "GuiView.h" #include "GuiWorkArea.h" #include "qt_helpers.h" -#include "Language.h" #include "Buffer.h" -#include "BufferParams.h" #include "BufferList.h" +#include "BufferParams.h" #include "BufferView.h" -#include "Text.h" -#include "TextClass.h" #include "Cursor.h" #include "FuncRequest.h" +#include "Language.h" +#include "Lexer.h" #include "LyX.h" #include "lyxfind.h" +#include "Text.h" +#include "TextClass.h" #include "frontends/alert.h" From 9fbee19a7ff7a6f2a015cf922dbbcb1dcaf84294 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Sun, 28 Feb 2016 17:21:26 +0100 Subject: [PATCH 63/76] Avoid incorrect "Autocorrect Off" message --- src/mathed/InsetMathNest.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/mathed/InsetMathNest.cpp b/src/mathed/InsetMathNest.cpp index 493f529d1e..9d90c1959d 100644 --- a/src/mathed/InsetMathNest.cpp +++ b/src/mathed/InsetMathNest.cpp @@ -715,8 +715,10 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd) cur.selHandle(select); // handle autocorrect: - cur.autocorrect() = false; - cur.message(_("Autocorrect Off ('!' to enter)")); + if (lyxrc.autocorrection_math && cur.autocorrect()) { + cur.autocorrect() = false; + cur.message(_("Autocorrect Off ('!' to enter)")); + } // go up/down bool up = act == LFUN_UP || act == LFUN_UP_SELECT; From 83d8e12cc1467931c566bca988a070ce992089fc Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Sun, 28 Feb 2016 17:36:29 +0100 Subject: [PATCH 64/76] Rename Cursor::setSelection(bool) to selection(bool) The old name would be confusing wrt setSelection(), which does additional checks. This one is a pure acessor, and the more complete methods are * setSelection(), which avoids empty selections * clearSelection(), which resets anchor, and sets word selection and mark more to false. Most of the code should use these two instead of selection(bool), but this is for later. --- src/BufferView.cpp | 16 +++++++-------- src/Cursor.cpp | 14 +++++++------- src/Cursor.h | 4 ++-- src/CutAndPaste.cpp | 2 +- src/Text.cpp | 4 ++-- src/Text3.cpp | 8 ++++---- src/TextMetrics.cpp | 2 +- src/frontends/qt4/GuiSpellchecker.cpp | 4 ++-- src/insets/InsetTabular.cpp | 28 +++++++++++++-------------- src/mathed/InsetMathGrid.cpp | 4 ++-- src/mathed/InsetMathNest.cpp | 8 ++++---- 11 files changed, 47 insertions(+), 47 deletions(-) diff --git a/src/BufferView.cpp b/src/BufferView.cpp index 883987eab6..1daee5c720 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -1587,7 +1587,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) break; case LFUN_MARK_TOGGLE: - cur.setSelection(false); + cur.selection(false); if (cur.mark()) { cur.setMark(false); dr.setMessage(from_utf8(N_("Mark removed"))); @@ -1786,7 +1786,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) // Select the inset from outside. cur.pop(); cur.resetAnchor(); - cur.setSelection(true); + cur.selection(true); cur.posForward(); } else if (cells_selected) { // At least one complete cell is selected and inset is a table. @@ -1794,7 +1794,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) cur.idx() = 0; cur.pos() = 0; cur.resetAnchor(); - cur.setSelection(true); + cur.selection(true); cur.idx() = cur.lastidx(); cur.pos() = cur.lastpos(); } else { @@ -1802,7 +1802,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) cur.pit() = 0; cur.pos() = 0; cur.resetAnchor(); - cur.setSelection(true); + cur.selection(true); cur.pit() = cur.lastpit(); cur.pos() = cur.lastpos(); } @@ -2187,7 +2187,7 @@ void BufferView::mouseEventDispatch(FuncRequest const & cmd0) Cursor old = cursor(); Cursor cur(*this); cur.push(buffer_.inset()); - cur.setSelection(d->cursor_.selection()); + cur.selection(d->cursor_.selection()); // Either the inset under the cursor or the // surrounding Text will handle this event. @@ -2374,7 +2374,7 @@ void BufferView::setCursorFromRow(int row, TexRow const & texrow) } d->cursor_.reset(); buffer_.text().setCursor(d->cursor_, newpit, newpos); - d->cursor_.setSelection(false); + d->cursor_.selection(false); d->cursor_.resetAnchor(); recenter(); } @@ -2460,7 +2460,7 @@ void BufferView::setCursor(DocIterator const & dit) dit[i].inset().edit(d->cursor_, true); d->cursor_.setCursor(dit); - d->cursor_.setSelection(false); + d->cursor_.selection(false); d->cursor_.setCurrentFont(); // FIXME // It seems on general grounds as if this is probably needed, but @@ -2589,7 +2589,7 @@ bool BufferView::selectIfEmpty(DocIterator & cur) d->cursor_.setCursor(cur); d->cursor_.pit() = beg_pit; d->cursor_.pos() = 0; - d->cursor_.setSelection(false); + d->cursor_.selection(false); d->cursor_.resetAnchor(); d->cursor_.pit() = end_pit; d->cursor_.pos() = end_pos; diff --git a/src/Cursor.cpp b/src/Cursor.cpp index b4ca8e0c65..baf529bfc8 100644 --- a/src/Cursor.cpp +++ b/src/Cursor.cpp @@ -997,18 +997,18 @@ DocIterator Cursor::selectionEnd() const void Cursor::setSelection() { - setSelection(true); + selection(true); if (idx() == normalAnchor().idx() && pit() == normalAnchor().pit() && pos() == normalAnchor().pos()) - setSelection(false); + selection(false); } void Cursor::setSelection(DocIterator const & where, int n) { setCursor(where); - setSelection(true); + selection(true); anchor_ = where; pos() += n; } @@ -1016,7 +1016,7 @@ void Cursor::setSelection(DocIterator const & where, int n) void Cursor::clearSelection() { - setSelection(false); + selection(false); setWordSelection(false); setMark(false); resetAnchor(); @@ -1079,7 +1079,7 @@ bool Cursor::selHandle(bool sel) cap::saveSelection(*this); resetAnchor(); - setSelection(sel); + selection(sel); return true; } } // namespace lyx @@ -1319,7 +1319,7 @@ bool Cursor::backspace() // let's require two backspaces for 'big stuff' and // highlight on the first resetAnchor(); - setSelection(true); + selection(true); --pos(); } else { --pos(); @@ -1366,7 +1366,7 @@ bool Cursor::erase() // 'clever' UI hack: only erase large items if previously slected if (pos() != lastpos() && nextAtom()->nargs() > 0) { resetAnchor(); - setSelection(true); + selection(true); ++pos(); } else { plainErase(); diff --git a/src/Cursor.h b/src/Cursor.h index acec12772f..aa31f91c96 100644 --- a/src/Cursor.h +++ b/src/Cursor.h @@ -161,8 +161,8 @@ public: // /// selection active? bool selection() const { return selection_; } - /// set selection; - void setSelection(bool sel) { selection_ = sel; } + /// set selection; this is lower level than (set|clear)Selection + void selection(bool sel) { selection_ = sel; } /// do we have a multicell selection? bool selIsMultiCell() const { return selection_ && selBegin().idx() != selEnd().idx(); } diff --git a/src/CutAndPaste.cpp b/src/CutAndPaste.cpp index 5f3e8090fb..86f66907b6 100644 --- a/src/CutAndPaste.cpp +++ b/src/CutAndPaste.cpp @@ -1325,7 +1325,7 @@ void selClearOrDel(Cursor & cur) if (lyxrc.auto_region_delete) selDel(cur); else - cur.setSelection(false); + cur.selection(false); } diff --git a/src/Text.cpp b/src/Text.cpp index f51646e55e..89028c8db6 100644 --- a/src/Text.cpp +++ b/src/Text.cpp @@ -1455,7 +1455,7 @@ void Text::deleteWordForward(Cursor & cur) cursorForward(cur); else { cur.resetAnchor(); - cur.setSelection(true); + cur.selection(true); cursorForwardOneWord(cur); cur.setSelection(); cutSelection(cur, true, false); @@ -1471,7 +1471,7 @@ void Text::deleteWordBackward(Cursor & cur) cursorBackward(cur); else { cur.resetAnchor(); - cur.setSelection(true); + cur.selection(true); cursorBackwardOneWord(cur); cur.setSelection(); cutSelection(cur, true, false); diff --git a/src/Text3.cpp b/src/Text3.cpp index 49df75efa3..0e8b4127be 100644 --- a/src/Text3.cpp +++ b/src/Text3.cpp @@ -178,7 +178,7 @@ static void mathDispatch(Cursor & cur, FuncRequest const & cmd) LASSERT(cur.inMathed(), return); cur.pos() = 0; cur.resetAnchor(); - cur.setSelection(true); + cur.selection(true); cur.pos() = cur.lastpos(); if (cmd.action() != LFUN_MATH_MODE) // LFUN_MATH_MODE has a different meaning in math mode @@ -1678,7 +1678,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) // We continue with our existing selection or start a new one, so don't // reset the anchor. bvcur.setCursor(cur); - bvcur.setSelection(true); + bvcur.selection(true); if (cur.top() == old) { // We didn't move one iota, so no need to update the screen. cur.screenUpdateFlags(Update::SinglePar | Update::FitCursor); @@ -2060,7 +2060,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) cur.push(*inset); cur.top().pos() = cur.top().lastpos(); cur.resetAnchor(); - cur.setSelection(true); + cur.selection(true); cur.top().pos() = 0; } break; @@ -2436,7 +2436,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) case LFUN_ESCAPE: if (cur.selection()) { - cur.setSelection(false); + cur.selection(false); } else { cur.undispatched(); // This used to be LFUN_FINISHED_RIGHT, I think FORWARD is more diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp index 6fb12b3734..e69ffe9c22 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -1622,7 +1622,7 @@ void TextMetrics::deleteLineForward(Cursor & cur) text_->cursorForward(cur); } else { cur.resetAnchor(); - cur.setSelection(true); // to avoid deletion + cur.selection(true); // to avoid deletion cursorEnd(cur); cur.setSelection(); // What is this test for ??? (JMarc) diff --git a/src/frontends/qt4/GuiSpellchecker.cpp b/src/frontends/qt4/GuiSpellchecker.cpp index aa62a9a448..24aa43d683 100644 --- a/src/frontends/qt4/GuiSpellchecker.cpp +++ b/src/frontends/qt4/GuiSpellchecker.cpp @@ -337,9 +337,9 @@ void SpellcheckerWidget::Private::setSelection( Cursor & bvcur = bv->cursor(); bvcur.setCursor(from); bvcur.clearSelection(); - bvcur.setSelection(true); + bvcur.selection(true); bvcur.setCursor(end); - bvcur.setSelection(true); + bvcur.selection(true); } else { // FIXME LFUN // If we used a LFUN, dispatch would do all of this for us diff --git a/src/insets/InsetTabular.cpp b/src/insets/InsetTabular.cpp index ac63676369..dda3003b83 100644 --- a/src/insets/InsetTabular.cpp +++ b/src/insets/InsetTabular.cpp @@ -3997,7 +3997,7 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd) cur.idx() = tabular.getLastCellInRow(r); cur.pit() = cur.lastpit(); cur.pos() = cur.lastpos(); - cur.setSelection(true); + cur.selection(true); bvcur = cur; rowselect_ = true; break; @@ -4012,7 +4012,7 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd) cur.idx() = tabular.cellIndex(tabular.nrows() - 1, c); cur.pit() = cur.lastpit(); cur.pos() = cur.lastpos(); - cur.setSelection(true); + cur.selection(true); bvcur = cur; colselect_ = true; break; @@ -4045,7 +4045,7 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd) cur.pit() = 0; cur.pos() = 0; bvcur.setCursor(cur); - bvcur.setSelection(true); + bvcur.selection(true); break; } // select (additional) column @@ -4057,7 +4057,7 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd) cur.pit() = 0; cur.pos() = 0; bvcur.setCursor(cur); - bvcur.setSelection(true); + bvcur.selection(true); break; } // only update if selection changes @@ -4066,7 +4066,7 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd) cur.noScreenUpdate(); setCursorFromCoordinates(cur, cmd.x(), cmd.y()); bvcur.setCursor(cur); - bvcur.setSelection(true); + bvcur.selection(true); // if this is a multicell selection, we just set the cursor to // the beginning of the cell's text. if (bvcur.selIsMultiCell()) { @@ -4083,12 +4083,12 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd) case LFUN_CELL_BACKWARD: movePrevCell(cur); - cur.setSelection(false); + cur.selection(false); break; case LFUN_CELL_FORWARD: moveNextCell(cur); - cur.setSelection(false); + cur.selection(false); break; case LFUN_CHAR_FORWARD_SELECT: @@ -5186,7 +5186,7 @@ int InsetTabular::dist(BufferView & bv, idx_type const cell, int x, int y) const Inset * InsetTabular::editXY(Cursor & cur, int x, int y) { //lyxerr << "InsetTabular::editXY: " << this << endl; - cur.setSelection(false); + cur.selection(false); cur.push(*this); cur.idx() = getNearestCell(cur.bv(), x, y); return cur.bv().textMetrics(&cell(cur.idx())->text()).editXY(cur, x, y); @@ -5545,7 +5545,7 @@ void InsetTabular::tabularFeatures(Cursor & cur, cur.idx() = tabular.cellIndex(sel_row_start, column); cur.pit() = 0; cur.pos() = 0; - cur.setSelection(false); + cur.selection(false); break; case Tabular::DELETE_COLUMN: @@ -5568,7 +5568,7 @@ void InsetTabular::tabularFeatures(Cursor & cur, cur.idx() = tabular.cellIndex(row, sel_col_start); cur.pit() = 0; cur.pos() = 0; - cur.setSelection(false); + cur.selection(false); break; case Tabular::COPY_ROW: @@ -5684,7 +5684,7 @@ void InsetTabular::tabularFeatures(Cursor & cur, tabular.rightLine(cur.selEnd().idx())); cur.pit() = 0; cur.pos() = 0; - cur.setSelection(false); + cur.selection(false); break; } @@ -5741,7 +5741,7 @@ void InsetTabular::tabularFeatures(Cursor & cur, tabular.getAlignment(cur.selEnd().idx())); cur.pit() = 0; cur.pos() = 0; - cur.setSelection(false); + cur.selection(false); break; } @@ -5946,7 +5946,7 @@ void InsetTabular::tabularFeatures(Cursor & cur, cur.idx() = tabular.setLTCaption(row, true); cur.pit() = 0; cur.pos() = 0; - cur.setSelection(false); + cur.selection(false); // If a row is set as caption, then also insert // a caption. Otherwise the LaTeX output is broken. // Select cell if it is non-empty @@ -5962,7 +5962,7 @@ void InsetTabular::tabularFeatures(Cursor & cur, cur.idx() = tabular.setLTCaption(row, false); cur.pit() = 0; cur.pos() = 0; - cur.setSelection(false); + cur.selection(false); FuncRequest fr(LFUN_INSET_DISSOLVE, "caption"); if (lyx::getStatus(fr).enabled()) lyx::dispatch(fr); diff --git a/src/mathed/InsetMathGrid.cpp b/src/mathed/InsetMathGrid.cpp index 3d120a5da8..b505886586 100644 --- a/src/mathed/InsetMathGrid.cpp +++ b/src/mathed/InsetMathGrid.cpp @@ -1416,7 +1416,7 @@ void InsetMathGrid::doDispatch(Cursor & cur, FuncRequest & cmd) case LFUN_CELL_BACKWARD: // See below. - cur.setSelection(false); + cur.selection(false); if (!idxPrev(cur)) { cmd = FuncRequest(LFUN_FINISHED_BACKWARD); cur.undispatched(); @@ -1426,7 +1426,7 @@ void InsetMathGrid::doDispatch(Cursor & cur, FuncRequest & cmd) case LFUN_CELL_FORWARD: // Can't handle selection by additional 'shift' as this is // hard bound to LFUN_CELL_BACKWARD - cur.setSelection(false); + cur.selection(false); if (!idxNext(cur)) { cmd = FuncRequest(LFUN_FINISHED_FORWARD); cur.undispatched(); diff --git a/src/mathed/InsetMathNest.cpp b/src/mathed/InsetMathNest.cpp index 9d90c1959d..7357b5f922 100644 --- a/src/mathed/InsetMathNest.cpp +++ b/src/mathed/InsetMathNest.cpp @@ -740,7 +740,7 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd) case LFUN_WORD_SELECT: cur.pos() = 0; cur.resetAnchor(); - cur.setSelection(true); + cur.selection(true); cur.pos() = cur.lastpos(); cur.bv().cursor() = cur; break; @@ -749,7 +749,7 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd) cur.idx() = 0; cur.pos() = 0; cur.resetAnchor(); - cur.setSelection(true); + cur.selection(true); cur.idx() = cur.lastidx(); cur.pos() = cur.lastpos(); cur.bv().cursor() = cur; @@ -1621,7 +1621,7 @@ void InsetMathNest::lfunMouseRelease(Cursor & cur, FuncRequest & cmd) cur.noScreenUpdate(); else { Cursor & bvcur = cur.bv().cursor(); - bvcur.setSelection(true); + bvcur.selection(true); } return; } @@ -1762,7 +1762,7 @@ bool InsetMathNest::interpretChar(Cursor & cur, char_type const c) // just clear selection on pressing the space bar if (cur.selection() && c == ' ') { - cur.setSelection(false); + cur.selection(false); return true; } From 0437d8dc1a75f60406a818e49efd3c8c9b489294 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Mon, 29 Feb 2016 13:29:06 +0100 Subject: [PATCH 65/76] Variables of type pit_type should be named pit, not par It is easier to use always the same conventions for naming. --- src/CutAndPaste.cpp | 8 ++++---- src/Text.cpp | 6 +++--- src/Text.h | 20 ++++++++++---------- src/Text2.cpp | 26 +++++++++++++------------- 4 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/CutAndPaste.cpp b/src/CutAndPaste.cpp index 86f66907b6..44bcb5e962 100644 --- a/src/CutAndPaste.cpp +++ b/src/CutAndPaste.cpp @@ -100,11 +100,11 @@ bool checkPastePossible(int index) struct PasteReturnValue { - PasteReturnValue(pit_type r_par, pos_type r_pos, bool r_nu) : - par(r_par), pos(r_pos), needupdate(r_nu) + PasteReturnValue(pit_type r_pit, pos_type r_pos, bool r_nu) : + pit(r_pit), pos(r_pos), needupdate(r_nu) {} - pit_type par; + pit_type pit; pos_type pos; bool needupdate; }; @@ -1074,7 +1074,7 @@ void pasteParagraphList(Cursor & cur, ParagraphList const & parlist, pasteSelectionHelper(cur, parlist, docclass, 0, errorList); cur.forceBufferUpdate(); cur.clearSelection(); - text->setCursor(cur, prv.par, prv.pos); + text->setCursor(cur, prv.pit, prv.pos); } // mathed is handled in InsetMathNest/InsetMathGrid diff --git a/src/Text.cpp b/src/Text.cpp index 89028c8db6..e6905ad026 100644 --- a/src/Text.cpp +++ b/src/Text.cpp @@ -109,12 +109,12 @@ static bool moveItem(Paragraph & fromPar, pos_type fromPos, void breakParagraphConservative(BufferParams const & bparams, - ParagraphList & pars, pit_type par_offset, pos_type pos) + ParagraphList & pars, pit_type pit, pos_type pos) { // create a new paragraph - Paragraph & tmp = *pars.insert(lyx::next(pars.begin(), par_offset + 1), + Paragraph & tmp = *pars.insert(lyx::next(pars.begin(), pit + 1), Paragraph()); - Paragraph & par = pars[par_offset]; + Paragraph & par = pars[pit]; tmp.setInsetOwner(&par.inInset()); tmp.makeSameLayout(par); diff --git a/src/Text.h b/src/Text.h index 2d855ecc8f..fa42290258 100644 --- a/src/Text.h +++ b/src/Text.h @@ -182,12 +182,12 @@ public: void rejectChanges(); /// returns true if par was empty and was removed - bool setCursor(Cursor & cur, pit_type par, pos_type pos, + bool setCursor(Cursor & cur, pit_type pit, pos_type pos, bool setfont = true, bool boundary = false); /// - void setCursor(CursorSlice &, pit_type par, pos_type pos); + void setCursor(CursorSlice &, pit_type pit, pos_type pos); /// - void setCursorIntern(Cursor & cur, pit_type par, + void setCursorIntern(Cursor & cur, pit_type pit, pos_type pos, bool setfont = true, bool boundary = false); /// Move cursor one position backwards @@ -322,20 +322,20 @@ public: docstring completionPrefix(Cursor const & cur) const; /// find a paragraph before \p par with the given \p depth, if such /// a paragraph cannot be found, \p par is returned - pit_type depthHook(pit_type par, depth_type depth) const; + pit_type depthHook(pit_type pit, depth_type depth) const; /// find a paragraph before \p par with depth less than the /// depth of \p par. If such paragraph cannot be found because /// \p par already has depth 0, lastpar + 1 is returned. If /// such paragraph cannot be found because there isn't a par /// with less depth before this one, \p par is returned. - pit_type outerHook(pit_type par) const; + pit_type outerHook(pit_type pit) const; /// Is it the first par with same depth and layout? - bool isFirstInSequence(pit_type par) const; + bool isFirstInSequence(pit_type pit) const; /// Is this paragraph in the table of contents? - int getTocLevel(pit_type par) const; + int getTocLevel(pit_type pit) const; /// Get the font of the "environment" of paragraph \p par_offset in \p pars. /// All font changes of the paragraph are relative to this font. - Font const outerFont(pit_type par_offset) const; + Font const outerFont(pit_type pit_offset) const; private: /// The InsetText owner shall have access to everything. @@ -383,7 +383,7 @@ private: /// void breakParagraphConservative(BufferParams const & bparams, ParagraphList & paragraphs, - pit_type par, + pit_type pit, pos_type pos); /** @@ -391,7 +391,7 @@ void breakParagraphConservative(BufferParams const & bparams, * Be careful, this doesent make any check at all. */ void mergeParagraph(BufferParams const & bparams, - ParagraphList & paragraphs, pit_type par); + ParagraphList & paragraphs, pit_type pit); /// accept the changes within the complete ParagraphList void acceptChanges(ParagraphList & pars, BufferParams const & bparams); diff --git a/src/Text2.cpp b/src/Text2.cpp index c3d696e7e2..ffde834272 100644 --- a/src/Text2.cpp +++ b/src/Text2.cpp @@ -547,25 +547,25 @@ void Text::insertInset(Cursor & cur, Inset * inset) } -bool Text::setCursor(Cursor & cur, pit_type par, pos_type pos, +bool Text::setCursor(Cursor & cur, pit_type pit, pos_type pos, bool setfont, bool boundary) { TextMetrics const & tm = cur.bv().textMetrics(this); - bool const update_needed = !tm.contains(par); + bool const update_needed = !tm.contains(pit); Cursor old = cur; - setCursorIntern(cur, par, pos, setfont, boundary); + setCursorIntern(cur, pit, pos, setfont, boundary); return cur.bv().checkDepm(cur, old) || update_needed; } -void Text::setCursor(CursorSlice & cur, pit_type par, pos_type pos) +void Text::setCursor(CursorSlice & cur, pit_type pit, pos_type pos) { - LASSERT(par != int(paragraphs().size()), return); - cur.pit() = par; + LASSERT(pit != int(paragraphs().size()), return); + cur.pit() = pit; cur.pos() = pos; // now some strict checking - Paragraph & para = getPar(par); + Paragraph const & par = getPar(pit); // None of these should happen, but we're scaredy-cats if (pos < 0) { @@ -573,21 +573,21 @@ void Text::setCursor(CursorSlice & cur, pit_type par, pos_type pos) LATTEST(false); } - if (pos > para.size()) { + if (pos > par.size()) { LYXERR0("Don't like 1, pos: " << pos - << " size: " << para.size() - << " par: " << par); + << " size: " << par.size() + << " par: " << pit); LATTEST(false); } } -void Text::setCursorIntern(Cursor & cur, - pit_type par, pos_type pos, bool setfont, bool boundary) +void Text::setCursorIntern(Cursor & cur, pit_type pit, pos_type pos, + bool setfont, bool boundary) { LBUFERR(this == cur.text()); cur.boundary(boundary); - setCursor(cur.top(), par, pos); + setCursor(cur.top(), pit, pos); if (setfont) cur.setCurrentFont(); } From a8cfeb1538f93240a4d84bd22e09876672b53dcb Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Mon, 29 Feb 2016 13:47:23 +0100 Subject: [PATCH 66/76] Move one Text::setCursor instance to CursorSlice This method did access more CursorSlice than Text. It is only a setter for CursorSlice with some bound checking. The new signature is setPitPos(pit_type, pos_type). --- src/CursorSlice.cpp | 22 ++++++++++++++++++++++ src/CursorSlice.h | 2 ++ src/Text.cpp | 4 ++-- src/Text.h | 2 -- src/Text2.cpp | 26 +------------------------- src/insets/InsetText.cpp | 2 +- 6 files changed, 28 insertions(+), 30 deletions(-) diff --git a/src/CursorSlice.cpp b/src/CursorSlice.cpp index ae3686fd1e..573ca9d4fe 100644 --- a/src/CursorSlice.cpp +++ b/src/CursorSlice.cpp @@ -92,6 +92,28 @@ CursorSlice::col_type CursorSlice::col() const } +void CursorSlice::setPitPos(pit_type pit, pos_type pos) +{ + LASSERT(pit != int(text()->paragraphs().size()), return); + pit_ = pit; + pos_ = pos; + + // Now some strict checking. None of these should happen, but + // we're scaredy-cats + if (pos < 0) { + LYXERR0("Don't like -1!"); + LATTEST(false); + } + + if (pos > paragraph().size()) { + LYXERR0("Don't like 1, pos: " << pos + << " size: " << paragraph().size() + << " par: " << pit); + LATTEST(false); + } +} + + void CursorSlice::forwardPos() { // move on one position if possible diff --git a/src/CursorSlice.h b/src/CursorSlice.h index f44c92e0c2..308b938455 100644 --- a/src/CursorSlice.h +++ b/src/CursorSlice.h @@ -119,6 +119,8 @@ public: Text * text() const { return inset_->getText(idx_); } /// paragraph in this cell Paragraph & paragraph() const; + /// + void setPitPos(pit_type pit, pos_type pos); /// /// mathed specific stuff diff --git a/src/Text.cpp b/src/Text.cpp index e6905ad026..d81dd868ad 100644 --- a/src/Text.cpp +++ b/src/Text.cpp @@ -1601,7 +1601,7 @@ bool Text::erase(Cursor & cur) if (needsUpdate) { // Make sure the cursor is correct. Is this really needed? // No, not really... at least not here! - cur.text()->setCursor(cur.top(), cur.pit(), cur.pos()); + cur.top().setPitPos(cur.pit(), cur.pos()); cur.checkBufferStructure(); } @@ -1708,7 +1708,7 @@ bool Text::backspace(Cursor & cur) // A singlePar update is not enough in this case. // cur.screenUpdateFlags(Update::Force); - setCursor(cur.top(), cur.pit(), cur.pos()); + cur.top().setPitPos(cur.pit(), cur.pos()); return needsUpdate; } diff --git a/src/Text.h b/src/Text.h index fa42290258..bdf2169fab 100644 --- a/src/Text.h +++ b/src/Text.h @@ -185,8 +185,6 @@ public: bool setCursor(Cursor & cur, pit_type pit, pos_type pos, bool setfont = true, bool boundary = false); /// - void setCursor(CursorSlice &, pit_type pit, pos_type pos); - /// void setCursorIntern(Cursor & cur, pit_type pit, pos_type pos, bool setfont = true, bool boundary = false); diff --git a/src/Text2.cpp b/src/Text2.cpp index ffde834272..96d1035243 100644 --- a/src/Text2.cpp +++ b/src/Text2.cpp @@ -558,36 +558,12 @@ bool Text::setCursor(Cursor & cur, pit_type pit, pos_type pos, } -void Text::setCursor(CursorSlice & cur, pit_type pit, pos_type pos) -{ - LASSERT(pit != int(paragraphs().size()), return); - cur.pit() = pit; - cur.pos() = pos; - - // now some strict checking - Paragraph const & par = getPar(pit); - - // None of these should happen, but we're scaredy-cats - if (pos < 0) { - LYXERR0("Don't like -1!"); - LATTEST(false); - } - - if (pos > par.size()) { - LYXERR0("Don't like 1, pos: " << pos - << " size: " << par.size() - << " par: " << pit); - LATTEST(false); - } -} - - void Text::setCursorIntern(Cursor & cur, pit_type pit, pos_type pos, bool setfont, bool boundary) { LBUFERR(this == cur.text()); cur.boundary(boundary); - setCursor(cur.top(), pit, pos); + cur.top().setPitPos(pit, pos); if (setfont) cur.setCurrentFont(); } diff --git a/src/insets/InsetText.cpp b/src/insets/InsetText.cpp index 017e1445d0..53115277a1 100644 --- a/src/insets/InsetText.cpp +++ b/src/insets/InsetText.cpp @@ -250,7 +250,7 @@ void InsetText::edit(Cursor & cur, bool front, EntryDirection entry_from) pos = temp_cur.pos(); } - text_.setCursor(cur.top(), pit, pos); + cur.top().setPitPos(pit, pos); cur.finishUndo(); } From 019fceda3fb37613c81e82ae29a66195a0414b80 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Mon, 29 Feb 2016 14:27:51 +0100 Subject: [PATCH 67/76] Remove variables set but not used This was found by cppcheck. --- src/LaTeX.cpp | 6 ++---- src/frontends/qt4/GuiCommandBuffer.cpp | 2 -- src/insets/InsetGraphicsParams.cpp | 1 - 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/LaTeX.cpp b/src/LaTeX.cpp index 6063d80719..0640275a36 100644 --- a/src/LaTeX.cpp +++ b/src/LaTeX.cpp @@ -955,8 +955,7 @@ bool handleFoundFile(string const & ff, DepTable & head) return true; // strip off part after last space and try again string tmp = strippedfile; - string const stripoff = - rsplit(tmp, strippedfile, ' '); + rsplit(tmp, strippedfile, ' '); absname.set(strippedfile); if (insertIfExists(absname, head)) return true; @@ -981,8 +980,7 @@ bool handleFoundFile(string const & ff, DepTable & head) break; // strip off part after last space and try again string strippedfile; - string const stripoff = - rsplit(foundfile, strippedfile, ' '); + rsplit(foundfile, strippedfile, ' '); foundfile = strippedfile; onlyfile = onlyFileName(strippedfile); absname = makeAbsPath(onlyfile); diff --git a/src/frontends/qt4/GuiCommandBuffer.cpp b/src/frontends/qt4/GuiCommandBuffer.cpp index 9880e2b996..b3f56c7444 100644 --- a/src/frontends/qt4/GuiCommandBuffer.cpp +++ b/src/frontends/qt4/GuiCommandBuffer.cpp @@ -225,7 +225,6 @@ void GuiCommandBuffer::itemSelected(QListWidgetItem * item) void GuiCommandBuffer::up() { - string const input = fromqstr(edit_->text()); string const h = historyUp(); if (!h.empty()) @@ -238,7 +237,6 @@ void GuiCommandBuffer::up() void GuiCommandBuffer::down() { - string const input = fromqstr(edit_->text()); string const h = historyDown(); if (!h.empty()) diff --git a/src/insets/InsetGraphicsParams.cpp b/src/insets/InsetGraphicsParams.cpp index 03ca0d6287..b7ea377f42 100644 --- a/src/insets/InsetGraphicsParams.cpp +++ b/src/insets/InsetGraphicsParams.cpp @@ -191,7 +191,6 @@ bool InsetGraphicsParams::Read(Lexer & lex, string const & token, lyxscale = lex.getInteger(); } else if (token == "display") { lex.next(); - string const type = lex.getString(); display = lex.getString() != "false"; } else if (token == "scale") { lex.next(); From f78967a802a4362992b0af7e3cb361719da53ff2 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Tue, 5 Apr 2016 14:27:30 +0200 Subject: [PATCH 68/76] Rename badly named variable --- src/Text.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Text.cpp b/src/Text.cpp index d81dd868ad..c003350781 100644 --- a/src/Text.cpp +++ b/src/Text.cpp @@ -907,11 +907,11 @@ void Text::insertChar(Cursor & cur, char_type c) if (lyxrc.auto_number) { static docstring const number_operators = from_ascii("+-/*"); static docstring const number_unary_operators = from_ascii("+-"); - static docstring const number_seperators = from_ascii(".,:"); + static docstring const number_separators = from_ascii(".,:"); if (cur.current_font.fontInfo().number() == FONT_ON) { if (!isDigitASCII(c) && !contains(number_operators, c) && - !(contains(number_seperators, c) && + !(contains(number_separators, c) && cur.pos() != 0 && cur.pos() != cur.lastpos() && tm.displayFont(pit, cur.pos()).fontInfo().number() == FONT_ON && @@ -932,7 +932,7 @@ void Text::insertChar(Cursor & cur, char_type c) ) { setCharFont(pit, cur.pos() - 1, cur.current_font, tm.font_); - } else if (contains(number_seperators, c) + } else if (contains(number_separators, c) && cur.pos() >= 2 && tm.displayFont(pit, cur.pos() - 2).fontInfo().number() == FONT_ON) { setCharFont(pit, cur.pos() - 1, cur.current_font, From 0d21dca360b55d83acae2a15466fdb879831ff03 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Thu, 12 May 2016 14:10:30 +0200 Subject: [PATCH 69/76] Cleanup handling of LFUN_LAYOUT in getStatus The way it works is: * the inset defines forcePlainLayout() correctly * Text::getStatus acts on it. Note that, in Text::getStatus, testing for cur.inset().forcePlainLayout() does not make much sense, since one should pass the cursor idx as parameter. There are many other lfuns that do not have to be handled directly by insets. InsetScript in particular has tests for way too many lfuns. --- src/Text3.cpp | 2 +- src/insets/InsetScript.cpp | 1 - src/insets/InsetScript.h | 2 ++ src/insets/InsetTabular.cpp | 3 --- 4 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/Text3.cpp b/src/Text3.cpp index 0e8b4127be..352d3cb429 100644 --- a/src/Text3.cpp +++ b/src/Text3.cpp @@ -3109,7 +3109,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd, docstring layout = cmd.argument(); if (layout.empty()) layout = tclass.defaultLayoutName(); - enable = !cur.inset().forcePlainLayout() && tclass.hasLayout(layout); + enable = !owner_->forcePlainLayout() && tclass.hasLayout(layout); flag.setOnOff(layout == cur.paragraph().layout().name()); break; diff --git a/src/insets/InsetScript.cpp b/src/insets/InsetScript.cpp index f8aae1e0c5..830307508d 100644 --- a/src/insets/InsetScript.cpp +++ b/src/insets/InsetScript.cpp @@ -263,7 +263,6 @@ bool InsetScript::getStatus(Cursor & cur, FuncRequest const & cmd, FuncStatus & flag) const { switch (cmd.action()) { - case LFUN_LAYOUT: case LFUN_LAYOUT_PARAGRAPH: case LFUN_MATH_DISPLAY: case LFUN_BOX_INSERT: diff --git a/src/insets/InsetScript.h b/src/insets/InsetScript.h index decfee37ae..84ed50e1b1 100644 --- a/src/insets/InsetScript.h +++ b/src/insets/InsetScript.h @@ -80,6 +80,8 @@ public: /// void read(Lexer & lex); /// + bool forcePlainLayout(idx_type = 0) const { return true; } + /// bool neverIndent() const { return true; } /// int plaintext(odocstringstream & ods, OutputParams const & op, diff --git a/src/insets/InsetTabular.cpp b/src/insets/InsetTabular.cpp index dda3003b83..71036cc0fb 100644 --- a/src/insets/InsetTabular.cpp +++ b/src/insets/InsetTabular.cpp @@ -3413,9 +3413,6 @@ bool InsetTableCell::getStatus(Cursor & cur, FuncRequest const & cmd, { bool enabled = true; switch (cmd.action()) { - case LFUN_LAYOUT: - enabled = !forcePlainLayout(); - break; case LFUN_LAYOUT_PARAGRAPH: enabled = allowParagraphCustomization(); break; From ccc8ad4744545bf08eb22454c0f6cb91a590f059 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Thu, 12 May 2016 17:31:47 +0200 Subject: [PATCH 70/76] Cleanup handling of LFUN_LAYOUT_PARAGRAPH in getStatus The way it works is: * the inset defines allowParagraphCustomization() correctly * Text::getStatus acts on it. Note that, in Text::getStatus, testing for cur.inset().allowParagraphCustomization() does not make much sense, since one should pass the cursor idx as parameter. Actually, for some reason the safest bet is to use the owner of the Text object as inset. --- src/Text3.cpp | 2 +- src/insets/InsetScript.cpp | 1 - src/insets/InsetScript.h | 2 ++ src/insets/InsetTabular.cpp | 4 ---- 4 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/Text3.cpp b/src/Text3.cpp index 352d3cb429..0467aa8b69 100644 --- a/src/Text3.cpp +++ b/src/Text3.cpp @@ -3145,7 +3145,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd, case LFUN_PARAGRAPH_PARAMS: case LFUN_PARAGRAPH_PARAMS_APPLY: case LFUN_PARAGRAPH_UPDATE: - enable = cur.inset().allowParagraphCustomization(); + enable = owner_->allowParagraphCustomization(); break; // FIXME: why are accent lfuns forbidden with pass_thru layouts? diff --git a/src/insets/InsetScript.cpp b/src/insets/InsetScript.cpp index 830307508d..bee4c541cf 100644 --- a/src/insets/InsetScript.cpp +++ b/src/insets/InsetScript.cpp @@ -263,7 +263,6 @@ bool InsetScript::getStatus(Cursor & cur, FuncRequest const & cmd, FuncStatus & flag) const { switch (cmd.action()) { - case LFUN_LAYOUT_PARAGRAPH: case LFUN_MATH_DISPLAY: case LFUN_BOX_INSERT: case LFUN_BRANCH_INSERT: diff --git a/src/insets/InsetScript.h b/src/insets/InsetScript.h index 84ed50e1b1..11864d305c 100644 --- a/src/insets/InsetScript.h +++ b/src/insets/InsetScript.h @@ -82,6 +82,8 @@ public: /// bool forcePlainLayout(idx_type = 0) const { return true; } /// + bool allowParagraphCustomization(idx_type = 0) const { return false; } + /// bool neverIndent() const { return true; } /// int plaintext(odocstringstream & ods, OutputParams const & op, diff --git a/src/insets/InsetTabular.cpp b/src/insets/InsetTabular.cpp index 71036cc0fb..6477ef3fe6 100644 --- a/src/insets/InsetTabular.cpp +++ b/src/insets/InsetTabular.cpp @@ -3413,10 +3413,6 @@ bool InsetTableCell::getStatus(Cursor & cur, FuncRequest const & cmd, { bool enabled = true; switch (cmd.action()) { - case LFUN_LAYOUT_PARAGRAPH: - enabled = allowParagraphCustomization(); - break; - case LFUN_MATH_DISPLAY: if (!hasFixedWidth()) { enabled = false; From 516d5d29dce28deab4601ec6aa714ca7ff59e6cd Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Mon, 23 May 2016 15:24:13 +0200 Subject: [PATCH 71/76] Fix drawing of buttonText (enforce same left/right spacing) The computation of the width of the button was wrong. If <--> stands for TEXT_TO_INSET_OFFSET/2 spacing, and if `[]' marks the button's limits, then the intent is <-->[<-->button text<-->]<--> Therefore the physical grey rectangle width is width - Inset::TEXT_TO_INSET_OFFSET With this change, the spacing on the right of the button is not larger than the left one. Fixes bug #10147. --- src/frontends/qt4/GuiPainter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontends/qt4/GuiPainter.cpp b/src/frontends/qt4/GuiPainter.cpp index 495a11a8a6..5329624a6a 100644 --- a/src/frontends/qt4/GuiPainter.cpp +++ b/src/frontends/qt4/GuiPainter.cpp @@ -579,7 +579,7 @@ void GuiPainter::buttonText(int x, int y, docstring const & str, static int const d = Inset::TEXT_TO_INSET_OFFSET / 2; - button(x + d, y - ascent, width - d, descent + ascent, mouseHover); + button(x + d, y - ascent, width - Inset::TEXT_TO_INSET_OFFSET, descent + ascent, mouseHover); text(x + Inset::TEXT_TO_INSET_OFFSET, y, str, font); } From 68149e380daad42bac69de5984ef1e21508d9cb3 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Mon, 23 May 2016 16:16:05 +0200 Subject: [PATCH 72/76] Remove extra spacing around InsetCommand buttons There is already a spacing of 2 pixels on each side of a button (e.g. collapsed inset). There is no need to add one extra pixel for command insets. Fixes part of bug #10149. --- src/insets/RenderButton.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/insets/RenderButton.cpp b/src/insets/RenderButton.cpp index 06fc653da7..ee1b1f44cd 100644 --- a/src/insets/RenderButton.cpp +++ b/src/insets/RenderButton.cpp @@ -51,7 +51,6 @@ void RenderButton::metrics(MetricsInfo &, Dimension & dim) const else fm.rectText(text_, dim.wid, dim.asc, dim.des); - dim.wid += 2; dim_ = dim; } @@ -64,9 +63,9 @@ void RenderButton::draw(PainterInfo & pi, int x, int y) const font.decSize(); if (editable_) { - pi.pain.buttonText(x + 1, y, text_, font, renderState()); + pi.pain.buttonText(x, y, text_, font, renderState()); } else { - pi.pain.rectText(x + 1, y, text_, font, + pi.pain.rectText(x, y, text_, font, Color_commandbg, Color_commandframe); } } From 320b616c50a1a46da4e3b2026ce795b1e9a96025 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=BCnter=20Milde?= Date: Mon, 23 May 2016 21:14:28 +0200 Subject: [PATCH 73/76] Improve documentation of LyX' "smart quotes" feature. --- lib/doc/UserGuide.lyx | 61 +- lib/doc/de/UserGuide.lyx | 2675 +++++++++++++++++++++++++++++++------- 2 files changed, 2255 insertions(+), 481 deletions(-) diff --git a/lib/doc/UserGuide.lyx b/lib/doc/UserGuide.lyx index 961910fcae..4bff11008f 100644 --- a/lib/doc/UserGuide.lyx +++ b/lib/doc/UserGuide.lyx @@ -134,11 +134,12 @@ enumitem \papercolumns 1 \papersides 2 \paperpagestyle default -\tracking_changes false +\tracking_changes true \output_changes false \html_math_output 0 \html_css_as_file 0 \html_be_strict true +\author 986154928 "Gnter Milde" \end_header \begin_body @@ -8310,14 +8311,12 @@ Verbatim \end_layout \begin_layout Verbatim - This is Verbatim. \end_layout \begin_layout Verbatim \noindent \align block - The following 2 lines are empty: \end_layout @@ -8330,7 +8329,6 @@ The following 2 lines are empty: \end_layout \begin_layout Verbatim - Almost everything is allowed in Verbatim:"%&$§#~'` \backslash }][{| @@ -8354,7 +8352,6 @@ Verbatim \end_layout \begin_layout Verbatim* - This is Verbatim*. \end_layout @@ -16982,6 +16979,42 @@ open close " \family default , generates this automatically. +\change_inserted 986154928 1464030688 + +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout + +\change_inserted 986154928 1464016381 +You can, of course, remove this +\begin_inset Quotes eld +\end_inset + +smart quotes +\begin_inset Quotes erd +\end_inset + + keybinding if you prefer. + See section +\begin_inset space ~ +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:Editing-Shortcuts" + +\end_inset + +. +\end_layout + +\end_inset + + +\change_unchanged + \end_layout \begin_layout Standard @@ -17153,7 +17186,23 @@ this \end_layout \begin_layout Standard -For single quotes you have to use the shortcut +For +\change_inserted 986154928 1464016392 + +\begin_inset Quotes eld +\end_inset + +smart +\begin_inset Quotes erd +\end_inset + + +\change_unchanged +single quotes +\change_deleted 986154928 1464016400 +you have to +\change_unchanged +use the shortcut \begin_inset Info type "shortcut" arg "quote-insert single" diff --git a/lib/doc/de/UserGuide.lyx b/lib/doc/de/UserGuide.lyx index 112be2ba78..565b537a52 100644 --- a/lib/doc/de/UserGuide.lyx +++ b/lib/doc/de/UserGuide.lyx @@ -148,6 +148,7 @@ enumitem \html_math_output 0 \html_css_as_file 0 \html_be_strict false +\author 986154928 "Gnter Milde" \end_header \begin_body @@ -526,7 +527,15 @@ Sie können Dokumente in \SpecialChar LyX \end_inset B. - DocBook als „Backend“ das PDFs erzeugen kann. + DocBook als +\begin_inset Quotes gld +\end_inset + +Backend +\begin_inset Quotes grd +\end_inset + + das PDFs erzeugen kann. Des Weiteren können Sie \SpecialChar LyX -Dokumente jederzeit als reine Textdatei oder XHTML ausgeben. @@ -1321,8 +1330,23 @@ beachten \family default können Sie festlegen, ob bei der Suche die Schreibweise berücksichtigt werden soll. - Ist sie aktiv, wird zum Beispiel bei der Suche nach „Treffen“ das Wort - „treffen“ nicht gefunden. + Ist sie aktiv, wird zum Beispiel bei der Suche nach +\begin_inset Quotes gld +\end_inset + +Treffen +\begin_inset Quotes grd +\end_inset + + das Wort +\begin_inset Quotes gld +\end_inset + +treffen +\begin_inset Quotes grd +\end_inset + + nicht gefunden. \end_layout \begin_layout Standard @@ -1338,8 +1362,31 @@ ganze Wörter \family default - schaltet den Modus „nur ganze Worte suchen“ ein und aus. - Dann wird beispielsweise bei der Suche nach „Treff“ das Wort „Treffer“ + schaltet den Modus +\begin_inset Quotes gld +\end_inset + +nur ganze Worte suchen +\begin_inset Quotes grd +\end_inset + + ein und aus. + Dann wird beispielsweise bei der Suche nach +\begin_inset Quotes gld +\end_inset + +Treff +\begin_inset Quotes grd +\end_inset + + das Wort +\begin_inset Quotes gld +\end_inset + +Treffer +\begin_inset Quotes grd +\end_inset + nicht gefunden. \end_layout @@ -1741,7 +1788,7 @@ Mit der F5 \family default -Taste wird der Cursor vertikal in \SpecialChar LyX -’ Hauptfenster zentriert. +' Hauptfenster zentriert. \end_layout \begin_layout Subsection @@ -1829,13 +1876,16 @@ Rechts-klicken auf Elemente in der Gliederung öffnet in vielen Fällen ein \end_layout \begin_layout Standard -Das Feld -\family sans -Filter -\family default - erlaubt es, die angezeigten Einträge einzugrenzen. +Das Feld `Filter' erlaubt es, die angezeigten Einträge einzugrenzen. Wenn zum Beispiel die Liste der Marken und Querverweise angezeigt ist und - Sie nur Verweise auf Unterabschnitte sehen wollen, geben Sie den Text „sub:“ + Sie nur Verweise auf Unterabschnitte sehen wollen, geben Sie den Text +\begin_inset Quotes gld +\end_inset + +sub: +\begin_inset Quotes grd +\end_inset + in den Filter ein und nur Einträge mit diesem Text werden angezeigt. \end_layout @@ -1963,8 +2013,7 @@ Navigieren ! Horizontaler Bildlauf \begin_layout Standard \SpecialChar LyX - hat keine horizontale Bildlauf\SpecialChar ligaturebreak -leiste, denn die Standard Seitenformate der + hat keine horizontale Bildlaufleiste, denn die Standard Seitenformate der Ausgabe, wie z. \begin_inset space \thinspace{} \end_inset @@ -2250,7 +2299,7 @@ B. autocorrect \family default zu finden, die sich irgendwo in \SpecialChar LyX -’ Installationsordner befindet. +' Installationsordner befindet. Die Automatische Korrektur kann jederzeit angeschaltet werden in dem man das Ausrufezeichen drückt '!'. Durch Drücken der Leertaste wird sie ausgeschaltet. @@ -2282,7 +2331,7 @@ emacs \family default . \SpecialChar LyX -’ Voreinstellung ist +' Voreinstellung ist \family typewriter cua \family default @@ -2293,8 +2342,7 @@ Bearbeiten\SpecialChar menuseparator Tastenkürzel \family default geändert werden kann. - (Man kann dort auch alle Tastenkürzel auf\SpecialChar ligaturebreak -listen oder ändern, wie es in + (Man kann dort auch alle Tastenkürzel auflisten oder ändern, wie es in Abschnitt \begin_inset space \thinspace{} \end_inset @@ -2458,7 +2506,15 @@ Es gibt drei Hilfstasten: \family sans Steuerung \family default - (in der Dokumentation als „Strg“ + (in der Dokumentation als +\begin_inset Quotes gld +\end_inset + +Strg +\begin_inset Quotes erd +\end_inset + + \begin_inset CommandInset nomenclature LatexCommand nomenclature symbol "Strg" @@ -2523,10 +2579,18 @@ Ende des Dokuments. Umschalt \family default (in der Dokumentation als +\begin_inset Quotes gld +\end_inset + + \family sans -„Umschalt +Umschalt \family default -“ + +\begin_inset Quotes erd +\end_inset + + \begin_inset CommandInset nomenclature LatexCommand nomenclature symbol "Umschalt" @@ -2544,7 +2608,15 @@ description "Umschalt-Taste" \family sans Alt \family default - (in der Dokumentation als „Alt“ + (in der Dokumentation als +\begin_inset Quotes gld +\end_inset + +Alt +\begin_inset Quotes erd +\end_inset + + \begin_inset CommandInset nomenclature LatexCommand nomenclature symbol "Alt" @@ -2553,7 +2625,15 @@ description "Alt oder Meta-Taste" \end_inset bezeichnet) Dies ist auf den meisten Tastaturen die Alt Taste, es sei denn - dass die Tastatur eine spezielle „Meta“ Taste besitzt. + dass die Tastatur eine spezielle +\begin_inset Quotes gld +\end_inset + +Meta +\begin_inset Quotes grd +\end_inset + + Taste besitzt. Haben Sie beide Tasten, müssen Sie herausfinden welche die Funktion der Alt Taste hat. \begin_inset Newline newline @@ -2571,8 +2651,12 @@ Diese Taste macht verschiedene Dinge und aktiviert zudem die Menü Schnellauswah \begin_deeper \begin_layout Standard Zum Beispiel öffnet die Sequenz +\begin_inset Quotes gld +\end_inset + + \family sans -„Alt +Alt \begin_inset space ~ \end_inset @@ -2590,16 +2674,36 @@ t \family sans b \family default -“ den „Textstil“ Dialog. + +\begin_inset Quotes erd +\end_inset + + den +\begin_inset Quotes gld +\end_inset + +Textstil +\begin_inset Quotes grd +\end_inset + + Dialog. +\begin_inset Quotes gld +\end_inset + + \family sans -„Alt +Alt \begin_inset space ~ \end_inset d \family default -“ öffnet das + +\begin_inset Quotes grd +\end_inset + + öffnet das \family sans Datei \family default @@ -2663,8 +2767,7 @@ Einstellungen Bearbeiten\SpecialChar menuseparator Tastenkürzel \family default - alle Tastenkürzel auf\SpecialChar ligaturebreak -listen oder ändern, wie es in Abschnitt + alle Tastenkürzel auflisten oder ändern, wie es in Abschnitt \begin_inset space ~ \end_inset @@ -2855,7 +2958,7 @@ Broadway Layout zum Schreiben von Theaterstücken. Dies ist keine \SpecialChar LaTeX \begin_inset ERT -status open +status collapsed \begin_layout Plain Layout @@ -3019,7 +3122,15 @@ Dokument ! Einstellungen \end_inset - gelistet sind, als „nicht verfügbar“ markiert sind. + gelistet sind, als +\begin_inset Quotes gld +\end_inset + +nicht verfügbar +\begin_inset Quotes grd +\end_inset + + markiert sind. Oder sie sind überrascht wenn sie z. \begin_inset space \thinspace{} \end_inset @@ -3060,15 +3171,29 @@ IOP \begin_layout Standard Falls es eine Dokumentklasse gibt, die Sie benutzen möchten, die aber als - „nicht verfügbar“ gekennzeichnet ist, müssen Sie die entsprechenden Paketdateie -n installieren. + +\begin_inset Quotes gld +\end_inset + +nicht verfügbar +\begin_inset Quotes grd +\end_inset + + gekennzeichnet ist, müssen Sie die entsprechenden Paketdateien installieren. Der einfachste Weg herauszufinden welche Dateien Sie installieren müssen, ist es, die Dokumentklasse für eine neue Datei zu verwenden. \SpecialChar LyX - wird dann einen Dialog zeigen, der die fehlenden Dateien auf\SpecialChar ligaturebreak -listet. - In Abschnitt „Installation eines neuen \SpecialChar LaTeX --Paketes“ des + wird dann einen Dialog zeigen, der die fehlenden Dateien auflistet. + In Abschnitt +\begin_inset Quotes gld +\end_inset + +Installation eines neuen \SpecialChar LaTeX +-Paketes +\begin_inset Quotes grd +\end_inset + + des \emph on Anpassung \emph default @@ -3251,7 +3376,7 @@ m Dokumenten verwendet zu werden. nur in diesem einen Dokument. Also so etwas wie einen dokumentspezifischen \SpecialChar LaTeX -Vorspann: \SpecialChar LyX -’ sogenanntes +' sogenanntes \begin_inset Quotes gld \end_inset @@ -3879,19 +4004,19 @@ Standard \begin_layout Itemize \family sans -A0 – A6 +A0 - A6 \end_layout \begin_layout Itemize \family sans -B0 – B6 +B0 - B6 \end_layout \begin_layout Itemize \family sans -C0 – C6 +C0 - C6 \end_layout \begin_layout Itemize @@ -3903,7 +4028,7 @@ US letter, US legal, US executive \begin_layout Itemize \family sans -JIS B0 – JIS B6 +JIS B0 - JIS B6 \end_layout \begin_layout Itemize @@ -4404,7 +4529,15 @@ Die verschiedenen Absatzumgebungen machen den Gebrauch unsauberer Tabstops, \end_layout \begin_layout Standard -Eine Absatzumgebung wählt man mit dem „Pull-down“-Menü +Eine Absatzumgebung wählt man mit dem +\begin_inset Quotes gld +\end_inset + +Pull-down +\begin_inset Quotes grd +\end_inset + +-Menü \begin_inset Graphics filename ../clipart/ToolbarEnvBox.png scale 70 @@ -4423,8 +4556,15 @@ Alt+A+Leertaste . Wenn das Menü geöffnet ist, können Sie die Einträge einschränken, wenn Sie Buchstaben eingeben, die in dem von Ihnen gesuchten Eintrag vorkommen. - Geben Sie zum Beispiel „abs“ ein, werden alle Einträge angezeigt, die mit - Abschnitten zu tun haben. + Geben Sie zum Beispiel +\begin_inset Quotes gld +\end_inset + +abs +\begin_inset Quotes grd +\end_inset + + ein, werden alle Einträge angezeigt, die mit Abschnitten zu tun haben. Mit der \family sans Esc @@ -5030,7 +5170,15 @@ s des Abschnittes und, falls möglich, des Kapitels, in dem der Unter-Unterabschni tt steht. Beispiel: der fünfte Abschnitt des zweiten Kapitels dieses Handbuches hat - die Marke „2.5“. + die Marke +\begin_inset Quotes gld +\end_inset + +2.5 +\begin_inset Quotes grd +\end_inset + +. \end_layout \begin_layout Subsubsection @@ -5194,8 +5342,15 @@ Einfügen Kurztitel \family default . - Dies fügt eine mit „Kurztitel“ beschriftete Box ein, in die man den Kurztitel - eingeben kann. + Dies fügt eine mit +\begin_inset Quotes gld +\end_inset + +Kurztitel +\begin_inset Quotes grd +\end_inset + + beschriftete Box ein, in die man den Kurztitel eingeben kann. Dies funktioniert auch für Beschriftungen innerhalb von Gleitumgebungen. Pro Überschrift ist nur ein Kurztitel zulässig. \end_layout @@ -5586,7 +5741,7 @@ gekrochen ist auf einen Baum, \begin_inset Newline newline \end_inset -schon meint, dass er ein Vöglein wär’ +schon meint, dass er ein Vöglein wär' \begin_inset Newline newline \end_inset @@ -5657,8 +5812,7 @@ name "subsec:Listen" hat vier verschiedene Absatzumgebungen, um unterschiedliche Listen zu erzeugen. In den \family sans -Auf\SpecialChar ligaturebreak -listung +Auflistung \family default - und \family sans @@ -5761,8 +5915,7 @@ name "subsec:Auflistung" \begin_layout Standard Der erste Listentyp, den wir genauer beschreiben werden, ist die \family sans -Auf\SpecialChar ligaturebreak -listung +Auflistung \family default -Absatz\SpecialChar softhyphen umgebung. @@ -5794,8 +5947,7 @@ Die Elemente können beliebig lang sein. rückt den linken Rand jedes Elements automatisch ein. Die Einrückung ist immer relativ zu der Umgebung, in der die \family sans -Auf\SpecialChar ligaturebreak -listung +Auflistung \family default sich befindet. \end_layout @@ -5803,8 +5955,7 @@ listung \begin_layout Itemize Wenn Sie \family sans -Auf\SpecialChar ligaturebreak -listung +Auflistung \family default -Umgebungen schachteln, bekommt jede Stufe ein neues Symbol als Markierung. \end_layout @@ -5831,14 +5982,12 @@ reference "sec:Umgebungen-schachteln" \begin_layout Standard Natürlich war diese Erklärung auch ein Beispiel für eine \family sans -Auf\SpecialChar ligaturebreak -listung +Auflistung \family default . Die \family sans -Auf\SpecialChar ligaturebreak -listung +Auflistung \family default -Umgebung eignet sich am besten für Listen, bei denen die Reihenfolge keine Rolle spielt. @@ -5853,8 +6002,7 @@ Wir sagten, dass unterschiedliche Stufen unterschiedliche Symbole als Markierung \begin_layout Itemize Die Marke für die erste Stufe von \family sans -Auf\SpecialChar ligaturebreak -listung +Auflistung \family default ist ein schwarzer Kreis. \begin_inset Separator latexpar @@ -5904,8 +6052,7 @@ Und zurück zu Stufe eins. \begin_layout Standard Dieses sind die Standardmarken für eine \family sans -Auf\SpecialChar ligaturebreak -listung +Auflistung \family default . Sie können diese Marken Ihren Wünschen anpassen, indem Sie im Dialogfenster @@ -5925,8 +6072,7 @@ Dokument ! Einstellungen unter \family sans -Auf\SpecialChar ligaturebreak -listungszeichen +Auflistungszeichen \family default die \family sans @@ -6075,8 +6221,7 @@ Aufzählung \begin_layout Enumerate Ebenso wie die \family sans -Auf\SpecialChar ligaturebreak -listung +Auflistung \family default -Umgebung macht die \family sans @@ -6113,8 +6258,7 @@ maximal vier Schachtelungsstufen sind erlaubt. \begin_layout Standard Anders als bei der \family sans -Auf\SpecialChar ligaturebreak -listung +Auflistung \family default -Umgebung sind die verschiedenen Marken von \family sans @@ -6355,8 +6499,7 @@ Beschreibung -Umgebung aber nicht benutzen, wenn Sie einen ganzen Satz hervorheben wollen. Dann benutzt man besser \family sans -Auf\SpecialChar ligaturebreak -listung +Auflistung \family default oder \family sans @@ -6560,7 +6703,7 @@ type "icon" arg "layout-paragraph" \end_inset -. +). Der Text im Feld \family sans Längste @@ -6571,11 +6714,27 @@ Marke \family default bestimmt die Standardmarkenbreite. Wenn Sie wollen, können Sie hier den Text Ihrer breitesten Marke eintragen - oder stattdessen den Buchstaben 'M' mehrfach hintereinander verwenden. + oder stattdessen den Buchstaben +\begin_inset Quotes gld +\end_inset + +M +\begin_inset Quotes grd +\end_inset + + mehrfach hintereinander verwenden. Das M ist der breiteste Buchstabe und eine Standard-Einheit von Längen in \SpecialChar LaTeX . - Verwendet man 'M' als Einheit der Breite, muss man die + Verwendet man +\begin_inset Quotes gld +\end_inset + +M +\begin_inset Quotes grd +\end_inset + + als Einheit der Breite, muss man die \family sans Längste \begin_inset space ~ @@ -6591,7 +6750,15 @@ Liste \begin_inset Newline newline \end_inset -Die voreingestellte Breite ist die Länge von „00.00.0000“ (entspricht 6 +Die voreingestellte Breite ist die Länge von +\begin_inset Quotes gld +\end_inset + +00.00.0000 +\begin_inset Quotes grd +\end_inset + + (entspricht 6 \begin_inset space ~ \end_inset @@ -6833,8 +7000,15 @@ Roman arabic \series default . - Um Punkte mit großen oder kleinen Buchstaben zu „nummerieren“, verwenden - Sie die Befehle + Um Punkte mit großen oder kleinen Buchstaben zu +\begin_inset Quotes gld +\end_inset + +nummerieren +\begin_inset Quotes grd +\end_inset + +, verwenden Sie die Befehle \series bold \backslash @@ -7880,8 +8054,7 @@ article \family sans report \family default --Dokument\SpecialChar softhyphen -klassen benutzen. +-Dokumentklassen benutzen. \end_layout \begin_layout Standard @@ -7963,7 +8136,7 @@ Zusammenfassung \begin_inset Float figure wide false sideways false -status collapsed +status open \begin_layout Plain Layout \align center @@ -8315,7 +8488,22 @@ Ein Schreibmaschinen-Anführungszeichen erreichen Sie nicht durch Eingabe \family sans ", \family default - weil das ein reales Anführungszeichen erzeugt. + weil das ein reales Anführungszeichen erzeugt +\change_inserted 986154928 1464017746 + (siehe Abschnitt +\begin_inset space ~ +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:Anführungszeichen" + +\end_inset + + +\change_unchanged +. Sie erhalten es stattdessen über das Menü \family sans Einfügen\SpecialChar menuseparator @@ -8489,10 +8677,12 @@ Unformatiert \end_layout \begin_layout Verbatim + Dies ist Unformatiert. \end_layout \begin_layout Verbatim + Die folgenden 2 Zeilen sind leer: \end_layout @@ -8505,6 +8695,7 @@ Die folgenden 2 Zeilen sind leer: \end_layout \begin_layout Verbatim + Fast alles ist in Unformatiert erlaubt:"%&$§#~'` \backslash }][{| @@ -8528,6 +8719,7 @@ Unformatiert \end_layout \begin_layout Verbatim* + Dies ist Unformatiert*. \end_layout @@ -8574,11 +8766,18 @@ reference "sec:Umgebungen-schachteln" \begin_layout Standard \SpecialChar LyX - unterscheidet sich vom normalen Konzept der „Textverarbeitung-als-Super\SpecialChar softhyphen + unterscheidet sich vom normalen Konzept der +\begin_inset Quotes gld +\end_inset + +Textverarbeitung-als-Super\SpecialChar softhyphen schreib\SpecialChar softhyphen -m -a\SpecialChar softhyphen -schine“ sehr stark. +ma\SpecialChar softhyphen +schine +\begin_inset Quotes grd +\end_inset + + sehr stark. Mit einer Schreibmaschine ist Text bloß Tinte auf Papier. Bei einigen Textverarbeitungen ist das auch heute noch das Hauptproblem. \SpecialChar LyX @@ -8617,11 +8816,11 @@ zwei \begin_deeper \begin_layout Enumerate -Unterliste – Punkt 1 +Unterliste - Punkt 1 \end_layout \begin_layout Enumerate -Unterliste – Punkt 2 +Unterliste - Punkt 2 \end_layout \end_deeper @@ -8869,8 +9068,7 @@ Zitat \begin_layout Itemize \family sans -Auf\SpecialChar ligaturebreak -listung +Auflistung \end_layout \begin_layout Itemize @@ -9480,7 +9678,7 @@ Wenn Sie dies in \SpecialChar LyX \end_layout \begin_layout Enumerate -Stufe 1 – außen +Stufe 1 - außen \begin_inset Separator latexpar \end_inset @@ -9563,17 +9761,24 @@ Aufzählung \family default -Umgebung und die \family sans -Auf\SpecialChar ligaturebreak -listung +Auflistung \family default -Umgebung nur vierfach schachteln. Wenn wir zum Beispiel eine weitere \family sans Aufzählung \family default - innerhalb von „A.“ erstellen wollten, würden wir Fehlermeldungen erhalten. + innerhalb von +\begin_inset Quotes gld +\end_inset + +A. +\begin_inset Quotes grd +\end_inset + + erstellen wollten, würden wir Fehlermeldungen erhalten. \begin_inset Foot -status open +status collapsed \begin_layout Plain Layout Noch einmal: \SpecialChar LyX @@ -9678,7 +9883,15 @@ Dies ist eine \family sans Standard \family default --Umgebung, in „3-a“ geschachtelt. +-Umgebung, in +\begin_inset Quotes gld +\end_inset + +3-a +\begin_inset Quotes grd +\end_inset + + geschachtelt. Also ist sie auf Stufe 4. Wir haben dies durch \family sans @@ -9707,8 +9920,7 @@ Aufzählung \family default - und \family sans -Auf\SpecialChar ligaturebreak -listung +Auflistung \family default -Umgebungen! \end_layout @@ -9750,7 +9962,15 @@ bung kann man nichts schachteln, deswegen sind wir noch auf 4. \emph on können \emph default - innerhalb von „3-a“ weiterschachteln. + innerhalb von +\begin_inset Quotes gld +\end_inset + +3-a +\begin_inset Quotes grd +\end_inset + + weiterschachteln. \begin_inset Separator latexpar \end_inset @@ -9787,10 +10007,6 @@ Alt+Eingabe \family default , gefolgt von \family sans - -\begin_inset Newline newline -\end_inset - Alt+Eingabe+Links \family default . @@ -9884,6 +10100,7 @@ Dies ist die -Code \family default -Umgebung auf Stufe 1, der äußersten Stufe. + \end_layout \begin_layout LyX-Code @@ -9891,11 +10108,7 @@ Jetzt werden wir Eingabe drücken, dann \family sans Alt+Eingabe+Rechts \family default -; danach -\begin_inset Newline newline -\end_inset - -werden wir zur +; danach werden wir zur \end_layout \begin_layout LyX-Code @@ -9960,8 +10173,7 @@ Aufzählung \family default - und \family sans -Auf\SpecialChar ligaturebreak -listung +Auflistung \family default -Umgebungen \begin_inset Argument 1 @@ -9999,17 +10211,12 @@ Alt+Eingabe \family default gedrückt, gefolgt von \family sans - -\begin_inset Newline newline -\end_inset - Alt+Eingabe+Rechts \family default . Was wird passieren, wenn wir eine \family sans -Auf\SpecialChar ligaturebreak -listung +Auflistung \family default -Umgebung hier hinein schachteln? Sie wird auf Stufe 3 sein, aber welche Marke wird es sein? Ein Stern? @@ -10028,8 +10235,7 @@ erste \emph default \family sans -Auf\SpecialChar ligaturebreak -listung +Auflistung \family default -Stufe, obwohl wir auf Stufe 3 sind. Deswegen ist die Marke ein schwarzer Kreis. @@ -10037,18 +10243,13 @@ listung \family sans Alt+Eingabe \family default -, -\begin_inset Newline newline -\end_inset - -dann +, dann \family sans Alt+Eingabe+Rechts \family default , dann der Umgebungswechsel auf \family sans -Auf\SpecialChar ligaturebreak -listung +Auflistung \family default .) \begin_inset Separator latexpar @@ -10063,11 +10264,7 @@ Hier ist Stufe 4, produziert mit \family sans Alt+Eingabe \family default -, dann -\begin_inset Newline newline -\end_inset - - +, dann \family sans Alt+Eingabe+Rechts. @@ -10231,8 +10428,7 @@ Aufzählung \family default - und \family sans -Auf\SpecialChar ligaturebreak -listung +Auflistung \family default -Umgebungen benutzt. Die Anzahl von @@ -10255,8 +10451,7 @@ Aufzählung -Eintrag benutzt. Dasselbe gilt auch für die \family sans -Auf\SpecialChar ligaturebreak -listung +Auflistung \family default -Umgebung. \end_layout @@ -10587,8 +10782,7 @@ Wie Sie sehen können, erreichen Sie mit dem Schachteln von Umgebungen in eine ganze Menge mit nur wenigen Tastendrücken. Wir hätten leicht eine \family sans -Auf\SpecialChar ligaturebreak -listung +Auflistung \family default innerhalb von \family sans @@ -10616,8 +10810,7 @@ Zitat \family default innerhalb von einer \family sans -Auf\SpecialChar ligaturebreak -listung +Auflistung \family default . Sie haben jede Menge Möglichkeiten zur Auswahl. @@ -10680,8 +10873,7 @@ Aufzählung \end_layout \begin_layout Itemize -Auf\SpecialChar ligaturebreak -listung +Auflistung \end_layout \end_deeper @@ -10819,14 +11011,30 @@ reference "sec:Literaturverzeichnis" Offensic \family default \series default -htlich sollte zwischen „Abschnitt“ und „ +htlich sollte zwischen +\begin_inset Quotes gld +\end_inset + +Abschnitt +\begin_inset Quotes erd +\end_inset + + und +\begin_inset Quotes gld +\end_inset + + \begin_inset CommandInset ref LatexCommand ref reference "sec:Literaturverzeichnis" \end_inset -“ ein geschütztes Leerzeichen stehen. + +\begin_inset Quotes erd +\end_inset + + ein geschütztes Leerzeichen stehen. Dieses wird über das Menü \family sans Einfügen @@ -10880,10 +11088,6 @@ Leerraum ! horizontaler \begin_layout Standard Alle horizontalen Leerräume können über das Menü \family sans - -\begin_inset Newline newline -\end_inset - Einfügen\SpecialChar menuseparator Formatierung\SpecialChar menuseparator Horizontaler @@ -11873,7 +12077,11 @@ jumps \end_layout \begin_layout Standard -So dass die Antwortmöglichkeiten exakt nach dem Ausdruck „Mr. +So dass die Antwortmöglichkeiten exakt nach dem Ausdruck +\begin_inset Quotes gld +\end_inset + +Mr. \begin_inset space ~ \end_inset @@ -11881,7 +12089,11 @@ Edge \begin_inset space ~ \end_inset -“ beginnen. + +\begin_inset Quotes grd +\end_inset + + beginnen. Dafür können Sie die Phantom-Einfügung im Menü \family sans Einfügen\SpecialChar menuseparator @@ -11890,7 +12102,11 @@ Phantom \family default verwenden. In unserem Fall fügen Sie ein horizontales Phantom am Anfang der letzten - beiden Zeilen ein und schreiben „Mr. + beiden Zeilen ein und schreiben +\begin_inset Quotes gld +\end_inset + +Mr. \begin_inset space ~ \end_inset @@ -11898,10 +12114,30 @@ Edge \begin_inset space ~ \end_inset -“ in das Phantom (beachten sie das Leerzeichen nach „Edge“). + +\begin_inset Quotes grd +\end_inset + + in das Phantom (beachten sie das Leerzeichen nach +\begin_inset Quotes gld +\end_inset + +Edge +\begin_inset Quotes erd +\end_inset + +). Eine Phantom-Einfügung gibt nur den Leerraum ihres Inhalts aus (so wie ein Platzhalter). - Das ist der Grund warum es „Phantom“ genannt wird. + Das ist der Grund warum es +\begin_inset Quotes gld +\end_inset + +Phantom +\begin_inset Quotes grd +\end_inset + + genannt wird. Das normale Phantom gibt die Höhe und Breite des Inhalts als Leerraum aus, während die horizontale und vertikale Variante nur die entsprechende Dimension ausgibt. @@ -12375,8 +12611,16 @@ Strg+Umschalt+Enter \family default eingefügt wird, bricht die Zeile um und dehnt sie dabei so, dass sie den kompletten Raum zwischen den Seitenrändern einnimmt. - Dies ist nützlich um „Fransen“ in Blocksatz-Absätzen zu verhindern, die - eventuell durch Leerraum aufgrund eines Zeilenumbruchs entstehen. + Dies ist nützlich um +\begin_inset Quotes gld +\end_inset + +Fransen +\begin_inset Quotes grd +\end_inset + + in Blocksatz-Absätzen zu verhindern, die eventuell durch Leerraum aufgrund + eines Zeilenumbruchs entstehen. \end_layout \begin_layout Standard @@ -12916,8 +13160,7 @@ reference "subsec:LaTeX-Schriftunterstützung" -Schriften sind dann allerdings nicht verfügbar. Es ist zu beachten, dass \SpecialChar LyX dann alle verfügbaren Schriften in jeder der - drei Listen (Serifenschrift, Serifenlose, und Schreibmaschine) auf\SpecialChar ligaturebreak -führt, + drei Listen (Serifenschrift, Serifenlose, und Schreibmaschine) aufführt, da \SpecialChar LyX die Familie nicht bestimmen kann. Des Weiteren kann die Ausgabe mit einigen der Schriften fehlschlagen, entweder @@ -12944,22 +13187,38 @@ Standard, verwendet die Schrift, die die aktuelle Dokumentklasse als Standard hat. In den meisten Fällen ist dies die Standard-\SpecialChar TeX -Schrift, die als +\begin_inset Quotes gld +\end_inset + + \family typewriter -„Computer +Computer \begin_inset space ~ \end_inset Modern \family default -“ ( + +\begin_inset Quotes grd +\end_inset + + ( \family typewriter cm \family default ) oder +\begin_inset Quotes gld +\end_inset + + \family typewriter -„European Computer Modern +European Computer Modern \family default -“ ( + +\begin_inset Quotes grd +\end_inset + + ( \family typewriter ec \family default @@ -13099,7 +13358,23 @@ stehlen \emph on Guillemets \emph default - '«' und '»', + +\begin_inset Quotes gld +\end_inset + +« +\begin_inset Quotes grd +\end_inset + + und +\begin_inset Quotes gld +\end_inset + +» +\begin_inset Quotes grd +\end_inset + +, \begin_inset Foot status collapsed @@ -13155,11 +13430,31 @@ zwei brève \emph default in einer PDF-Datei suchen, werden Sie es nicht finden, weil der PDF-Betrachter - nach „è“ sucht und nicht nach „e + + nach +\emph on + +\begin_inset Quotes gld +\end_inset + + +\emph default +è +\begin_inset Quotes grd +\end_inset + + sucht und nicht nach +\begin_inset Quotes gld +\end_inset + +e + \begin_inset space ~ \end_inset - ̀“. + ̀ +\begin_inset Quotes grd +\end_inset + +. \end_layout \begin_layout Itemize @@ -13534,7 +13829,7 @@ nicht die Bildschirmschrift! Die Änderung ist nur in der Ausgabe sichtbar; dies ist Teil des WYSIWYM Konzeptes. \SpecialChar LyX -’ Bildschirmschriften können im Dialog +' Bildschirmschriften können im Dialog \family sans Werkzeuge\SpecialChar menuseparator Einstellungen @@ -14421,7 +14716,15 @@ Winzig \family default \size tiny -Dies ist die „winzige“ Schriftgröße. +Dies ist die +\begin_inset Quotes gld +\end_inset + +winzige +\begin_inset Quotes grd +\end_inset + + Schriftgröße. \size default (Tastenkürzel: @@ -14455,7 +14758,15 @@ Klein \family default \size scriptsize -Dies ist die „sehr kleine“ Schriftgröße. +Dies ist die +\begin_inset Quotes gld +\end_inset + +sehr kleine +\begin_inset Quotes grd +\end_inset + + Schriftgröße. \size default (Tastenkürzel: @@ -14477,7 +14788,15 @@ Fußnote \family default \size footnotesize -Dies ist die „Fußnoten“-Schriftgröße. +Dies ist die +\begin_inset Quotes pld +\end_inset + +Fußnoten +\begin_inset Quotes erd +\end_inset + +-Schriftgröße. \size default ( @@ -14503,7 +14822,15 @@ Klein \family default \size small -Dies ist die „kleine“ Schriftgröße. +Dies ist die +\begin_inset Quotes gld +\end_inset + +kleine +\begin_inset Quotes erd +\end_inset + + Schriftgröße. \size default ( @@ -14535,7 +14862,15 @@ Alt+S \family sans Normal \family default - Dies ist die „normale“ Schriftgröße. + Dies ist die +\begin_inset Quotes gld +\end_inset + +normale +\begin_inset Quotes erd +\end_inset + + Schriftgröße. Dies ist auch die Standardgröße (Tastenkürzel: \family sans Alt+S @@ -14559,7 +14894,15 @@ Groß \family default \size large -Dies ist die „große“ Schriftgröße. +Dies ist die +\begin_inset Quotes gld +\end_inset + +große +\begin_inset Quotes grd +\end_inset + + Schriftgröße. \size default (Tastenkürzel: @@ -14589,7 +14932,15 @@ Größer \family default \size larger -Dies ist die „größere“ Schriftgröße. +Dies ist die +\begin_inset Quotes gld +\end_inset + +größere +\begin_inset Quotes grd +\end_inset + + Schriftgröße. \size default (Tastenkürzel: @@ -14623,7 +14974,15 @@ Größer \family default \size largest -Dies ist die „noch größere“ Schriftgröße. +Dies ist die +\begin_inset Quotes gld +\end_inset + +noch größere +\begin_inset Quotes grd +\end_inset + + Schriftgröße. \size default (Tastenkürzel: @@ -14645,7 +15004,15 @@ Riesig \family default \size huge -Dies ist die „riesige“ Schriftgröße. +Dies ist die +\begin_inset Quotes gld +\end_inset + +riesige +\begin_inset Quotes grd +\end_inset + + Schriftgröße. \size default (Tastenkürzel: @@ -14675,8 +15042,15 @@ Gigantisch \family default \size giant -Dies ist die „gigantische“ Schrift\SpecialChar softhyphen -größe. +Dies ist die +\begin_inset Quotes gld +\end_inset + +gigantische +\begin_inset Quotes grd +\end_inset + + Schriftgröße. \size default (Tastenkürzel: @@ -14784,11 +15158,7 @@ Unterstrichen Dies ist unterstrichener Text. \bar default - -\begin_inset Newline newline -\end_inset - -(Tastenkürzel + (Tastenkürzel \family sans Alt+Z \begin_inset space ~ @@ -14827,11 +15197,7 @@ unterstrichen Dies ist doppelt unterstrichener Text. \uuline default - -\begin_inset Newline newline -\end_inset - -(Tastenkürzel + (Tastenkürzel \family sans Alt+Z \begin_inset space ~ @@ -14862,11 +15228,7 @@ unterstrichen Dies ist wellig unterstrichener Text. \uwave default - -\begin_inset Newline newline -\end_inset - -(Tastenkürzel + (Tastenkürzel \family sans Alt+Z \begin_inset space ~ @@ -14895,11 +15257,7 @@ Durchgestrichen Dies ist durchgestrichener Text. \strikeout default - -\begin_inset Newline newline -\end_inset - -(Tastenkürzel + (Tastenkürzel \family sans Strg+Umschalt+O \family default @@ -15018,8 +15376,23 @@ Leertaste \family default . Will man nur die Einstellungen umschalten, die man gerade geändert hat - (angenommen man hat gerade den Schnitt auf „geneigt“ und die Strichstärke - auf „fett“ gesetzt), verwendet man die Option + (angenommen man hat gerade den Schnitt auf +\begin_inset Quotes gld +\end_inset + +geneigt +\begin_inset Quotes grd +\end_inset + + und die Strichstärke auf +\begin_inset Quotes gld +\end_inset + +fett +\begin_inset Quotes grd +\end_inset + + gesetzt), verwendet man die Option \family sans Alle \begin_inset space ~ @@ -15055,8 +15428,31 @@ Schreibmaschine \family typewriter Schreibmaschine \family default - ist eine sogenannte „nichtproportionale“ Schriftart, was bedeutet, dass - jedes Zeichen dieselbe Breite hat; das 'i' ist so breit wie das 'm'. + ist eine sogenannte +\begin_inset Quotes gld +\end_inset + +nichtproportionale +\begin_inset Quotes grd +\end_inset + + Schriftart, was bedeutet, dass jedes Zeichen dieselbe Breite hat; das +\begin_inset Quotes gld +\end_inset + +i +\begin_inset Quotes grd +\end_inset + + ist so breit wie das +\begin_inset Quotes gld +\end_inset + +m +\begin_inset Quotes grd +\end_inset + +. Hier ist ein Beispiel \begin_inset Newline newline \end_inset @@ -15109,8 +15505,15 @@ kein Schreibmaschine-Text Serifenschrift \family default Schriftarten verwenden Zeichen mit Serifen. - Dies sind die kleinen „Anhängsel“ am Ende der Striche, die ein Zeichen - bilden. + Dies sind die kleinen +\begin_inset Quotes gld +\end_inset + +Anhängsel +\begin_inset Quotes grd +\end_inset + + am Ende der Striche, die ein Zeichen bilden. Das folgende Beispiel zeigt den Unterschied: \begin_inset Newline newline \end_inset @@ -15143,7 +15546,14 @@ Serifenlos \end_layout \begin_layout Standard -„Umschalten“ bezieht sich auf das Setzen oder Entfernen von Schrifteigenschaften. +\begin_inset Quotes gld +\end_inset + +Umschalten +\begin_inset Quotes grd +\end_inset + + bezieht sich auf das Setzen oder Entfernen von Schrifteigenschaften. Wenn eine Eigenschaft fürs Umschalten im Textstil-Dialog ausgewählt ist, wird sie vom ausgewählten Text entfernt, wenn dieser schon die Eigenschaft besitzt. @@ -15156,10 +15566,32 @@ B. die Schrifteigenschaften B, C, F und G hat, und wenn B auf umschalten, C auf nicht umschalten gesetzt ist, wird der Text danach die Eigenschaften A, C, F und G haben. - „Niemals Umschalten“ und „Immer Umschalten“ bedeutet, dass man die Umschalt-Eig -enschaft nicht kontrolliert. - Für die Eigenschaften der linken Seite des Dialogs („Familie“ usw.) entscheidet - man selbst über das Umschalten. + +\begin_inset Quotes gld +\end_inset + +Niemals Umschalten +\begin_inset Quotes grd +\end_inset + + und +\begin_inset Quotes gld +\end_inset + +Immer Umschalten +\begin_inset Quotes grd +\end_inset + + bedeutet, dass man die Umschalt-Eigenschaft nicht kontrolliert. + Für die Eigenschaften der linken Seite des Dialogs ( +\begin_inset Quotes gld +\end_inset + +Familie +\begin_inset Quotes grd +\end_inset + + usw.) entscheidet man selbst über das Umschalten. Wenn \family sans Alle @@ -15170,12 +15602,36 @@ umschalten \family default gewählt ist, werden alle Eigenschaften der linken Dialogseite umgeschaltet; standardmäßig werden sie nicht umgeschaltet. - Die Einstellung „Zurücksetzen“ wird nie umgeschaltet. + Die Einstellung +\begin_inset Quotes gld +\end_inset + +Zurücksetzen +\begin_inset Quotes grd +\end_inset + + wird nie umgeschaltet. Wenn man z. \begin_inset space \thinspace{} \end_inset -B: „Strichstärke“ auf „Zurücksetzen“ setzt, +B: +\begin_inset Quotes gld +\end_inset + +Strichstärke +\begin_inset Quotes grd +\end_inset + + auf +\begin_inset Quotes gld +\end_inset + +Zurücksetzen +\begin_inset Quotes grd +\end_inset + + setzt, \family sans Alle \begin_inset space ~ @@ -15184,7 +15640,15 @@ Alle umschalten \family default wählt und dies auf fett gesetzten Text anwendet, wird auf die Voreinstellung - „Mittel“ zurückgesetzt, egal wie oft man den Stil anwendet. + +\begin_inset Quotes gld +\end_inset + +Mittel +\begin_inset Quotes grd +\end_inset + + zurückgesetzt, egal wie oft man den Stil anwendet. \end_layout \begin_layout Standard @@ -15423,7 +15887,7 @@ Dieses Dateiformat hat die Endung die Datei mit anderen Werkzeugen bearbeiten. Die \SpecialChar LaTeX -Datei wird automatisch in \SpecialChar LyX -’ temporärem Verzeichnis erstellt, wann +' temporärem Verzeichnis erstellt, wann immer Sie Ihr Dokument ansehen oder exportieren. \end_layout @@ -15466,14 +15930,29 @@ Dateiformate ! DVI \end_layout \begin_layout Standard -Dieses Dateiformat hat die Endung „ +Dieses Dateiformat hat die Endung +\begin_inset Quotes gld +\end_inset + + \family typewriter .dvi \family default -“. - Diese bedeutet „device-independent“ (geräteunabhängig) da dieses Format - genau das ist: Man kann es auf allen Computern ohne irgend welche Konvertierung -en einsetzen. + +\begin_inset Quotes grd +\end_inset + +. + Diese bedeutet +\begin_inset Quotes gld +\end_inset + +device-independent +\begin_inset Quotes grd +\end_inset + + (geräteunabhängig) da dieses Format genau das ist: Man kann es auf allen + Computern ohne irgend welche Konvertierungen einsetzen. DVIs eignen sich für schnelle Voransicht für andere Ausgabeformate wie PostScript. \end_layout @@ -15545,7 +16024,7 @@ Dateiformate ! PostScript \begin_layout Standard Dieses Dateiformat hat die Endung -\begin_inset Quotes gld +\begin_inset Quotes eld \end_inset @@ -15553,7 +16032,7 @@ Dieses Dateiformat hat die Endung .ps \family default -\begin_inset Quotes grd +\begin_inset Quotes erd \end_inset . @@ -15564,8 +16043,16 @@ Adobe als Druckersprache entwickelt. Das Format enthält daher Befehle, die Drucker verwenden um die Datei zu drucken. - PostScript kann als „Programmiersprache“ angesehen werden; man kann damit - Berechnungen durchführen und Diagramme und Bilder zeichnen. + PostScript kann als +\begin_inset Quotes gld +\end_inset + +Programmiersprache +\begin_inset Quotes grd +\end_inset + + angesehen werden; man kann damit Berechnungen durchführen und Diagramme + und Bilder zeichnen. \begin_inset Foot status collapsed @@ -15596,8 +16083,15 @@ status collapsed \end_layout \begin_layout Standard -PostScript kann Bilder nur im Format „Encapsulated PostScript“ (EPS, Dateiendung - +PostScript kann Bilder nur im Format +\begin_inset Quotes gld +\end_inset + +Encapsulated PostScript +\begin_inset Quotes grd +\end_inset + + (EPS, Dateiendung \begin_inset Quotes gld \end_inset @@ -15605,7 +16099,11 @@ PostScript kann Bilder nur im Format „Encapsulated PostScript“ (EPS, Dateien \family typewriter .eps \family default -“) enthalten. + +\begin_inset Quotes grd +\end_inset + +) enthalten. Da \SpecialChar LyX es erlaubt jedes bekannte Bildformat in Dokumente einzufügen, muss es diese im Hintergrund in EPS konvertieren. @@ -15683,19 +16181,42 @@ Dieses Dateiformat hat die Endung \end_inset . - Das „Portable Document Format“ (PDF) wurde von + Das +\begin_inset Quotes gld +\end_inset + +Portable Document Format +\begin_inset Quotes grd +\end_inset + + (PDF) wurde von \family typewriter Adobe \family default von PostScript abgeleitet. Es ist komprimierter und verwendet weniger Befehle als PostScript. - Wie der Name „portable“ (übertragbar) impliziert, kann es auf jedem Computersys -tem dargestellt werden und der Ausdruck wird exakt gleich aussehen. + Wie der Name +\begin_inset Quotes gld +\end_inset + +portable +\begin_inset Quotes grd +\end_inset + + (übertragbar) impliziert, kann es auf jedem Computersystem dargestellt + werden und der Ausdruck wird exakt gleich aussehen. \end_layout \begin_layout Standard -PDF kann Bilder in seinem eigenen PDF-Format sowie in den Formaten „Joint - Photographic Experts Group“ (JPG, Dateiendung +PDF kann Bilder in seinem eigenen PDF-Format sowie in den Formaten +\begin_inset Quotes gld +\end_inset + +Joint Photographic Experts Group +\begin_inset Quotes grd +\end_inset + + (JPG, Dateiendung \begin_inset Quotes gld \end_inset @@ -15719,7 +16240,15 @@ PDF kann Bilder in seinem eigenen PDF-Format sowie in den Formaten „Joint \begin_inset Quotes grd \end_inset -) und „Portable Network Graphics“ (PNG, Dateiendung +) und +\begin_inset Quotes gld +\end_inset + +Portable Network Graphics +\begin_inset Quotes grd +\end_inset + + (PNG, Dateiendung \begin_inset Quotes gld \end_inset @@ -15996,8 +16525,15 @@ Handbuchergänzungen \end_layout \begin_layout Standard -Die XHTML-Ausgabe ist noch „in der Entwicklung“ so dass noch nicht alle - Funktionen von \SpecialChar LyX +Die XHTML-Ausgabe ist noch +\begin_inset Quotes gld +\end_inset + +in der Entwicklung +\begin_inset Quotes grd +\end_inset + + so dass noch nicht alle Funktionen von \SpecialChar LyX unterstützt werden. Siehe das Kapitel \emph on @@ -16115,7 +16651,7 @@ Andere Formate aktualisieren \begin_layout Standard Bei der Vorschau eines Dokuments wird die Ausgabedatei nur in \SpecialChar LyX -’ temporärem +' temporärem Verzeichnis erzeugt. Für eine permanente Ausgabe muss das Dokument exportiert werden. \end_layout @@ -16160,11 +16696,19 @@ Gedankenstriche \begin_layout Standard In \SpecialChar LyX - hat das ' + hat das +\begin_inset Quotes gld +\end_inset + + \family typewriter - \family default -'-Zeichen vier Längen + +\begin_inset Quotes eld +\end_inset + +-Zeichen vier Längen \emph on : \emph default @@ -16456,7 +17000,7 @@ Minuszeichen \begin_layout Standard Wenn Sie dies in \SpecialChar LyX - lesen, sehen Sie kaum Unterschiede, aber in der gedruckten + lesen, sehen Sie keine Unterschiede, aber in der gedruckten Version erkennen Sie es. \end_layout @@ -16718,7 +17262,11 @@ reference "subsec:TeX-Code-Kästchen" \begin_inset Newline newline \end_inset -„Im Deutschen werden zusammengesetzte Worte entweder zusammengeschrieben + +\begin_inset Quotes gld +\end_inset + +Im Deutschen werden zusammengesetzte Worte entweder zusammengeschrieben wie eben oder mit einem Bindestrich zusammengefügt wie bei Programmiersprachen \begin_inset ERT status collapsed @@ -16731,7 +17279,11 @@ status collapsed \end_inset Handbücher\SpecialChar ldots -“ + +\begin_inset Quotes grd +\end_inset + + \end_layout \begin_layout Enumerate @@ -16760,8 +17312,15 @@ Weil \SpecialChar LyX \end_layout \begin_layout Standard -kann es wie hier vorkommen, dass die Zeile nach dem '-'-Zeichen umgebrochen - wird, was natürlich Unsinn ist. +kann es wie hier vorkommen, dass die Zeile nach dem +\begin_inset Quotes gld +\end_inset + +- +\begin_inset Quotes grd +\end_inset + +-Zeichen umgebrochen wird, was natürlich Unsinn ist. Dann verwendet man am besten den geschützten Trennstrich \begin_inset Index idx status collapsed @@ -16941,11 +17500,19 @@ Strg+Alt+Leertaste \end_layout \begin_layout Enumerate -Benutzen Sie einen kleinen Zwischenraum „ +Benutzen Sie einen kleinen Zwischenraum +\begin_inset Quotes gld +\end_inset + + \begin_inset space \thinspace{} \end_inset -“ ( + +\begin_inset Quotes grd +\end_inset + + ( \begin_inset CommandInset citation LatexCommand cite key "latex-einführung" @@ -17042,15 +17609,75 @@ status collapsed \end_inset +\change_inserted 986154928 1464017699 + +\begin_inset CommandInset label +LatexCommand label +name "subsec:Anführungszeichen" + +\end_inset + + +\change_unchanged + \end_layout \begin_layout Standard \SpecialChar LyX setzt Anführungszeichen normalerweise richtig. - Insbesondere wird es unterschiedliche Anführungszeichen für den Beginn - und das Ende des eingeschlossenen Textes benutzen. - Zum Beispiel „Anfang Ende“. - Das Tastaturzeichen + Insbesondere +\change_deleted 986154928 1464016816 +wird es +\change_inserted 986154928 1464017342 +werden bei der Eingabe von +\family sans + +\begin_inset Info +type "shortcut" +arg "quote-insert" +\end_inset + + +\change_unchanged + +\family default + unterschiedliche Anführungszeichen für den Beginn und das Ende des eingeschloss +enen Textes benutz +\change_inserted 986154928 1464017341 +t +\change_deleted 986154928 1464016841 +en. +\change_inserted 986154928 1464017341 +, +\change_unchanged + +\change_deleted 986154928 1464016846 +Z +\change_inserted 986154928 1464017341 +z +\change_unchanged +um +\change_inserted 986154928 1464017341 + +\begin_inset space \thinspace{} +\end_inset + + +\change_deleted 986154928 1464016866 + +\change_unchanged +Beispiel +\begin_inset Quotes gld +\end_inset + +Anfang Ende +\begin_inset Quotes grd +\end_inset + +. + +\change_deleted 986154928 1464017364 +Das Tastaturzeichen \family sans " \family default @@ -17059,12 +17686,61 @@ status collapsed Umschalt+2) \family default wird sie automatisch erzeugen. +\change_inserted 986154928 1464017500 + +\begin_inset Foot +status open + +\begin_layout Plain Layout + +\change_inserted 986154928 1464017594 +Natürlich kann diese +\begin_inset Quotes gld +\end_inset + +smart-quotes +\begin_inset Quotes grd +\end_inset + + Tastenbindung auch entfernt werden (siehe Abschnitt +\begin_inset space ~ +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:Tastenkürzel-bearbeiten" + +\end_inset + +). +\change_unchanged + +\end_layout + +\end_inset + + +\change_unchanged + \end_layout \begin_layout Standard Sie können das Verhalten der +\change_inserted 986154928 1464017416 + \family sans + +\begin_inset Info +type "shortcut" +arg "quote-insert" +\end_inset + + +\change_deleted 986154928 1464017416 " +\change_unchanged + \family default -Taste im Dialogfenster \family sans @@ -17095,75 +17771,199 @@ Anführungszeichen \family default einstellen. +\change_deleted 986154928 1464017018 + \end_layout \begin_layout Standard + +\change_deleted 986154928 1464017023 Über \family sans Anführungszeichen \family default - können Sie sechs verschiedene Anführungszeichen auswählen: + können +\change_unchanged +Sie +\change_inserted 986154928 1464017026 +können +\change_unchanged +sechs verschiedene Anführungszeichen +\change_inserted 986154928 1464017048 +stile +\change_unchanged + auswählen: \end_layout \begin_layout Labeling \labelwidthstring 00.00.0000 \family sans -“Text” +\begin_inset Quotes eld +\end_inset + +Text +\begin_inset Quotes erd +\end_inset + + \family default - benutzt die Anführungszeichen: “doppelt” + benutzt die Anführungszeichen: +\begin_inset Quotes eld +\end_inset + +doppelt +\begin_inset Quotes grd +\end_inset + + \end_layout \begin_layout Labeling \labelwidthstring 00.00.0000 \family sans -”Text” +\begin_inset Quotes sld +\end_inset + +Text +\begin_inset Quotes srd +\end_inset + + \family default - benutzt die Anführungszeichen: ”doppelt” + benutzt die Anführungszeichen: +\begin_inset Quotes sld +\end_inset + +doppelt +\begin_inset Quotes srd +\end_inset + + \end_layout \begin_layout Labeling \labelwidthstring 00.00.0000 \family sans -„Text“ +\begin_inset Quotes gld +\end_inset + +Text +\begin_inset Quotes grd +\end_inset + + \family default - benutzt die Anführungszeichen: „doppelt“ + benutzt die Anführungszeichen: +\begin_inset Quotes gld +\end_inset + +doppelt +\begin_inset Quotes grd +\end_inset + + \end_layout \begin_layout Labeling \labelwidthstring 00.00.0000 \family sans -„Text” +\begin_inset Quotes pld +\end_inset + +Text +\begin_inset Quotes prd +\end_inset + + \family default - benutzt die Anführungszeichen: „doppelt” + benutzt die Anführungszeichen: +\begin_inset Quotes pld +\end_inset + +doppelt +\begin_inset Quotes prd +\end_inset + + \end_layout \begin_layout Labeling \labelwidthstring 00.00.0000 \family sans -«Text» +\begin_inset Quotes fld +\end_inset + +Text +\begin_inset Quotes frd +\end_inset + + \family default - benutzt die Anführungszeichen: «doppelt» + benutzt die Anführungszeichen: +\begin_inset Quotes fld +\end_inset + +doppelt +\begin_inset Quotes frd +\end_inset + + \end_layout \begin_layout Labeling \labelwidthstring 00.00.0000 \family sans -»Text« +\begin_inset Quotes ald +\end_inset + +Text +\begin_inset Quotes ard +\end_inset + + \family default - benutzt die Anführungszeichen: »doppelt« + benutzt die Anführungszeichen: +\begin_inset Quotes ald +\end_inset + +doppelt +\begin_inset Quotes ard +\end_inset + + \end_layout \begin_layout Standard -Um ein einfaches Anführungszeichens zu schreiben wollen, benutzen Sie +Um ein einfaches Anführungszeichens zu schreiben +\change_deleted 986154928 1464016748 + wollen +\change_unchanged +, benutzen Sie +\change_deleted 986154928 1464016754 + \family sans -Alt+" +Alt+ +\begin_inset Quotes grd +\end_inset + + +\change_inserted 986154928 1464016770 + \family default + +\begin_inset Info +type "shortcut" +arg "quote-insert single" +\end_inset + + +\change_unchanged . \end_layout @@ -17265,12 +18065,42 @@ ffl \begin_layout Standard Manchmal aber möchte man keine Ligaturen in einem Wort. - Während eine Ligatur in einem Wort wie „Graffiti“ vielleicht in Ordnung - ist, sieht es in zusammengesetzten Worten seltsam aus, zum Beispiel „Stofflappe -n“ oder „Dorffest“. + Während eine Ligatur in einem Wort wie +\begin_inset Quotes pld +\end_inset + +Graffiti +\begin_inset Quotes grd +\end_inset + + vielleicht in Ordnung ist, sieht es in zusammengesetzten Worten seltsam + aus, zum Beispiel +\begin_inset Quotes pld +\end_inset + +Stofflappen +\begin_inset Quotes grd +\end_inset + + oder +\begin_inset Quotes pld +\end_inset + +Dorffest +\begin_inset Quotes grd +\end_inset + +. Um die Ligatur aufzuheben benutzt man den \SpecialChar LaTeX --Befehl „|“ zwischen den Buchstaben - ( +-Befehl +\begin_inset Quotes pld +\end_inset + +| +\begin_inset Quotes grd +\end_inset + + zwischen den Buchstaben ( \family sans Einfügen\SpecialChar menuseparator Formatierung\SpecialChar menuseparator @@ -17291,9 +18121,41 @@ Ligatur!-trenner Strg+Umschalt+L \family default ). - Dies macht aus „Stofflappen“ „Stoff\SpecialChar ligaturebreak -lappen“ und aus „Dorffest“ „Dorf\SpecialChar ligaturebreak -fest“. + Dies macht aus +\begin_inset Quotes pld +\end_inset + +Stofflappen +\begin_inset Quotes grd +\end_inset + + +\begin_inset Quotes pld +\end_inset + +Stoff\SpecialChar ligaturebreak +lappen +\begin_inset Quotes grd +\end_inset + + und aus +\begin_inset Quotes pld +\end_inset + +Dorffest +\begin_inset Quotes grd +\end_inset + + +\begin_inset Quotes pld +\end_inset + +Dorf\SpecialChar ligaturebreak +fest +\begin_inset Quotes grd +\end_inset + +. \end_layout \begin_layout Subsection @@ -17358,11 +18220,19 @@ ietet \SpecialChar LyX \begin_layout Standard Sie wundern sich vielleicht warum die \SpecialChar LaTeX --Version „2 +-Version +\begin_inset Quotes gld +\end_inset + +2 \begin_inset Formula $\epsilon$ \end_inset -“ ist. + +\begin_inset Quotes grd +\end_inset + + ist. Es ist eine alte Tradition in der \SpecialChar TeX -Welt, dass man für Programme verrückte Versionsnummern vergibt. @@ -17371,9 +18241,25 @@ Sie wundern sich vielleicht warum die \SpecialChar LaTeX \begin_inset Formula $\pi$ \end_inset -: Die aktuelle Version ist „\SpecialChar TeX --3.141592“, die vorherige war „\SpecialChar TeX --3.14159“. +: Die aktuelle Version ist +\begin_inset Quotes gld +\end_inset + +\SpecialChar TeX +-3.141592 +\begin_inset Quotes grd +\end_inset + +, die vorherige war +\begin_inset Quotes gld +\end_inset + +\SpecialChar TeX +-3.14159 +\begin_inset Quotes grd +\end_inset + +. \end_layout \begin_layout Subsection @@ -17395,8 +18281,15 @@ Im Allgemeinen ist der Abstand zwischen Zahl und Einheit kleiner als ein normales Leerzeichen zwischen zwei Wörtern. Wie man im Beispiel sehen kann, sieht es besser aus, wenn der Abstand kleiner ist. - Um solch ein „halbes Leerzeichen“ für Einheiten einzufügen, verwendet man - das Menü + Um solch ein +\begin_inset Quotes gld +\end_inset + +halbes Leerzeichen +\begin_inset Quotes erd +\end_inset + + für Einheiten einzufügen, verwendet man das Menü \family sans Einfügen\SpecialChar menuseparator Formatierung\SpecialChar menuseparator @@ -17794,12 +18687,20 @@ arg "footnote-insert" \end_inset Diese Box ist \SpecialChar LyX -’ Darstellung einer Fußnote. +' Darstellung einer Fußnote. Klickt man mit links auf die Marke +\begin_inset Quotes gld +\end_inset + + \family sans -„Fußnote +Fußnote \family default -“, wird die Box geöffnet und man kann den Fußnotentext hineinschreiben. + +\begin_inset Quotes grd +\end_inset + +, wird die Box geöffnet und man kann den Fußnotentext hineinschreiben. Nochmaliges Klicken auf die Marke schließt die Box. Will man bestehenden Text als Fußnote setzen, markiert man ihn einfach und klickt dann auf den Fußnoten-Werkzeugleistenknopf. @@ -17876,7 +18777,15 @@ type "icon" arg "marginalnote-insert" \end_inset - eine Randnotiz einfügen, erscheint eine Box mit der Beschriftung „Rand“. + eine Randnotiz einfügen, erscheint eine Box mit der Beschriftung +\begin_inset Quotes gld +\end_inset + +Rand +\begin_inset Quotes grd +\end_inset + +. Diese Box repräsentiert in \SpecialChar LyX eine Randnotiz. \end_layout @@ -18175,11 +19084,27 @@ Treppeneffekt Aliasing \emph default ). - Bekannte Formate sind „Graphics Interchange Format“ (GIF, Dateiendung „ + Bekannte Formate sind +\begin_inset Quotes eld +\end_inset + +Graphics Interchange Format +\begin_inset Quotes erd +\end_inset + + (GIF, Dateiendung +\begin_inset Quotes eld +\end_inset + + \family typewriter .gif \family default -“) + +\begin_inset Quotes erd +\end_inset + +) \begin_inset Index idx status collapsed @@ -18211,11 +19136,27 @@ status collapsed \end_inset -, „Portable Network Graphics“ (PNG, Dateiendung „ +, +\begin_inset Quotes eld +\end_inset + +Portable Network Graphics +\begin_inset Quotes erd +\end_inset + + (PNG, Dateiendung +\begin_inset Quotes eld +\end_inset + + \family typewriter .png \family default -“) + +\begin_inset Quotes erd +\end_inset + +) \begin_inset Index idx status collapsed @@ -18247,15 +19188,39 @@ status collapsed \end_inset -, und „Joint Photographic Experts Group“ (JPG, Dateiendung „ +, und +\begin_inset Quotes eld +\end_inset + +Joint Photographic Experts Group +\begin_inset Quotes erd +\end_inset + + (JPG, Dateiendung +\begin_inset Quotes eld +\end_inset + + \family typewriter .jpg \family default -“ oder „ + +\begin_inset Quotes erd +\end_inset + + oder +\begin_inset Quotes eld +\end_inset + + \family typewriter .jpeg \family default -“) + +\begin_inset Quotes erd +\end_inset + +) \begin_inset Index idx status collapsed @@ -18308,12 +19273,27 @@ Grafiken \begin_inset Newline newline \end_inset -Skalierbare Grafikformate können „Scalable Vector Graphics“ (SVG, Dateiendung - „ +Skalierbare Grafikformate können +\begin_inset Quotes gld +\end_inset + +Scalable Vector Graphics +\begin_inset Quotes grd +\end_inset + + (SVG, Dateiendung +\begin_inset Quotes gld +\end_inset + + \family typewriter .svg \family default -“) + +\begin_inset Quotes grd +\end_inset + +) \begin_inset Index idx status collapsed @@ -18345,11 +19325,27 @@ status collapsed \end_inset -, „Encapsulated PostScript“ (EPS, Dateiendung „ +, +\begin_inset Quotes gld +\end_inset + +Encapsulated PostScript +\begin_inset Quotes grd +\end_inset + + (EPS, Dateiendung +\begin_inset Quotes gld +\end_inset + + \family typewriter .eps \family default -“) + +\begin_inset Quotes grd +\end_inset + +) \begin_inset Index idx status collapsed @@ -18381,11 +19377,27 @@ status collapsed \end_inset - und „Portable Document Format“ (PDF, Dateiendung „ + und +\begin_inset Quotes gld +\end_inset + +Portable Document Format +\begin_inset Quotes grd +\end_inset + + (PDF, Dateiendung +\begin_inset Quotes gld +\end_inset + + \family typewriter .pdf \family default -“) + +\begin_inset Quotes grd +\end_inset + +) \begin_inset Index idx status collapsed @@ -21492,8 +22504,15 @@ Einführung \begin_layout Standard Ein Gleitobjekt ist ein Teil eines Dokuments, das keinen festen Platz hat. - Es kann eine oder mehrere Seiten vorwärts oder rückwärts „gleiten“, dahin - wo es am besten passt. + Es kann eine oder mehrere Seiten vorwärts oder rückwärts +\begin_inset Quotes gld +\end_inset + +gleiten +\begin_inset Quotes grd +\end_inset + +, dahin wo es am besten passt. \family sans Fußnoten @@ -21546,11 +22565,19 @@ Gleitobjekt \end_inset B. - die Beschriftung „Abbildung + die Beschriftung +\begin_inset Quotes gld +\end_inset + +Abbildung \begin_inset space ~ \end_inset -#:“ hat (# ist die aktuelle Nummer) wird in das Dokument eingefügt. +#: +\begin_inset Quotes grd +\end_inset + + hat (# ist die aktuelle Nummer) wird in das Dokument eingefügt. Die Beschriftung wird automatisch in der Ausgabe in die Dokumentsprache übersetzt. Nach der Beschriftung kann man einen Text für die Legende eingeben. @@ -21727,9 +22754,25 @@ arg "dialog-show-new-inset ref" . Es ist wichtig Querverweise für Abbildungs-Gleitobjekte zu verwenden, und - nicht vage Formulierungen wie „die obige Abbildung“, denn \SpecialChar LaTeX - wird die Gleitobjekt -e in der Ausgabe neu anordnen, so dass sie nicht mehr „obig“ sein muss. + nicht vage Formulierungen wie +\begin_inset Quotes gld +\end_inset + +die obige Abbildung +\begin_inset Quotes grd +\end_inset + +, denn \SpecialChar LaTeX + wird die Gleitobjekte in der Ausgabe neu anordnen, so dass sie nicht + mehr +\begin_inset Quotes gld +\end_inset + +obig +\begin_inset Quotes grd +\end_inset + + sein muss. Für mehr über Querverweise siehe Abschnitt \begin_inset space ~ \end_inset @@ -21943,7 +22986,15 @@ arg "float-insert table" eingefügt werden. Sie haben dieselben Eigenschaften wie Abbildungs-Gleitobjekte bis auf dass die Tabelle darin normalerweise unter die Beschriftung statt wie bei Abbildunge -n darüber gesetzt wird und dass die Marken mit „tab:“ beginnen. +n darüber gesetzt wird und dass die Marken mit +\begin_inset Quotes gld +\end_inset + +tab: +\begin_inset Quotes grd +\end_inset + + beginnen. Tabelle \begin_inset space ~ \end_inset @@ -22741,7 +23792,14 @@ x^2 y \series default eingeben. - Wenn Sie Zeichen in der Hochstellung haben, die mit dem Zirkumflex '^' + Wenn Sie Zeichen in der Hochstellung haben, die mit dem Zirkumflex +\begin_inset Quotes gld +\end_inset + +^ +\begin_inset Quotes grd +\end_inset + akzentuiert werden können, müssen Sie die \family sans Leertaste @@ -23921,7 +24979,7 @@ Einfügen\SpecialChar menuseparator Mathe\SpecialChar menuseparator Array-Umgebung \family default -: dann bekommen Sie automatisch eine 2×2-Matrix, oder Sie klicken in der +: dann bekommen Sie automatisch eine 2x2-Matrix, oder Sie klicken in der automatischen \family sans Mathe-Werkzeugleiste @@ -24368,13 +25426,28 @@ arg "label-insert" ) eingefügt, wenn sich der Cursor in der Gleichung befindet. Es erscheint ein Dialog, in den man die Marke eingibt. Es ist empfohlen, dass man das vorgeschlagene +\begin_inset Quotes gld +\end_inset + + \family sans -„eq: +eq: \family default -“ als ersten Teil der Marke verwendet, da dies später hilft, schnell den + +\begin_inset Quotes grd +\end_inset + + als ersten Teil der Marke verwendet, da dies später hilft, schnell den Typ der Marke zu finden, wenn man viele Marken im Dokument hat. - Wir haben im folgenden Beispiel die Marke „eq:tanhExp“ in der zweiten Zeile - eingegeben: + Wir haben im folgenden Beispiel die Marke +\begin_inset Quotes gld +\end_inset + +eq:tanhExp +\begin_inset Quotes grd +\end_inset + + in der zweiten Zeile eingegeben: \begin_inset Formula \begin{eqnarray} \tanh(x) & = & \frac{\sinh(x)}{\cosh(x)}\nonumber \\ @@ -24416,7 +25489,7 @@ reference "eq:tanhExp" \begin_layout Standard Die Eigenschaften von \SpecialChar LyX -’ Querverweis-Box sind in Abschnitt +' Querverweis-Box sind in Abschnitt \begin_inset space ~ \end_inset @@ -24891,8 +25964,7 @@ Kalligrafisch Der Tastaturbefehl, um zu einem speziellen Schriftstil zu wechseln, wird im \family typewriter -Mathe\SpecialChar softhyphen -Modus +Mathe-Modus \family default wie beschrieben interpretiert. Der @@ -25269,7 +26341,7 @@ name "sec:Querverweise" \begin_layout Standard Eine von \SpecialChar LyX -’ Stärken sind Querverweise. +' Stärken sind Querverweise. Sie können auf jeden Abschnitt, jedes Gleitobjekt, jede Fußnote, Formel und Liste im Dokument referenzieren. Für eine Referenz müssen Sie zuerst eine Marke in den zu referenzieren @@ -25335,10 +26407,26 @@ enu:Zweiter-Eintrag . Der Präfix +\begin_inset Quotes gld +\end_inset + + \family sans -„enu: +enu: \family default -“ steht für „enumerate“ (auf deutsch: + +\begin_inset Quotes grd +\end_inset + + steht für +\begin_inset Quotes gld +\end_inset + +enumerate +\begin_inset Quotes grd +\end_inset + + (auf deutsch: \emph on nummeriert \emph default @@ -25350,10 +26438,18 @@ nummeriert B. +\begin_inset Quotes gld +\end_inset + + \family sans -„sec: +sec: \family default -“ (Englisch für + +\begin_inset Quotes grd +\end_inset + + (Englisch für \emph on section \emph default @@ -25384,10 +26480,18 @@ arg "dialog-show-new-inset ref" Marken. Um eine Marke einzufügen, können Sie die Marken alphabetisch sortieren und wählen dann +\begin_inset Quotes gld +\end_inset + + \family sans -„enu:Zweiter-Eintrag +enu:Zweiter-Eintrag \family default -“ aus. + +\begin_inset Quotes grd +\end_inset + + aus. Im Feld \family sans Format @@ -25488,7 +26592,15 @@ reference "tab:Ein-Tabellen-Gleitobjekt" \begin_layout Description (): druckt die Nummer umgeben von zwei runden Klammern, dies ist der Stil, wie er normalerweise für Verweise auf Formeln verwendet wird, - speziell wenn der Name „Gleichung“ weggelassen wird: + speziell wenn der Name +\begin_inset Quotes gld +\end_inset + +Gleichung +\begin_inset Quotes grd +\end_inset + + weggelassen wird: \begin_inset CommandInset ref LatexCommand eqref reference "tab:Ein-Tabellen-Gleitobjekt" @@ -25522,7 +26634,15 @@ Seite \begin_inset space ~ \end_inset -: druckt den Text „auf Seite“ und die Seitennummer: +: druckt den Text +\begin_inset Quotes gld +\end_inset + +auf Seite +\begin_inset Quotes grd +\end_inset + + und die Seitennummer: \begin_inset CommandInset ref LatexCommand vpageref reference "tab:Ein-Tabellen-Gleitobjekt" @@ -25542,10 +26662,32 @@ auf dieser Seite \end_inset gedruckt; wenn sich die Marke auf der gegenüberliegenden Seite in einem - doppelseitigen Dokument befindet, wird „auf der gegenüberliegenden Seite“ + doppelseitigen Dokument befindet, wird +\begin_inset Quotes gld +\end_inset + +auf der gegenüberliegenden Seite +\begin_inset Quotes grd +\end_inset + gedruckt; befindet sie sich auf der vorigen Seite, die keine gegenüberliegende - ist, wird „auf der vorherigen Seite“ gedruckt; wenn sie sich auf der nächsten, - nicht gegenüberliegenden Seite befindet, wird „auf der nächsten Seite“ + ist, wird +\begin_inset Quotes gld +\end_inset + +auf der vorherigen Seite +\begin_inset Quotes grd +\end_inset + + gedruckt; wenn sie sich auf der nächsten, nicht gegenüberliegenden Seite + befindet, wird +\begin_inset Quotes gld +\end_inset + +auf der nächsten Seite +\begin_inset Quotes grd +\end_inset + gedruckt. Der Wortlaut des gedruckten Texts hängt zudem von der verwendeten Dokumentklass e ab. @@ -25564,8 +26706,15 @@ Seite \begin_inset space ~ \end_inset -: druckt die Nummer, den Text „auf Seite“, und die Seitennummer: - +: druckt die Nummer, den Text +\begin_inset Quotes gld +\end_inset + +auf Seite +\begin_inset Quotes grd +\end_inset + +, und die Seitennummer: \begin_inset CommandInset ref LatexCommand vref reference "tab:Ein-Tabellen-Gleitobjekt" @@ -25699,10 +26848,18 @@ newref B. alle Verweise auf Abbildungen (die den Marken-Präfix +\begin_inset Quotes gld +\end_inset + + \family sans -„fig +fig \family default -“ haben) umzuformatieren, verwendet man den Befehl + +\begin_inset Quotes grd +\end_inset + + haben) umzuformatieren, verwendet man den Befehl \begin_inset Newline newline \end_inset @@ -25825,8 +26982,16 @@ Marken können jederzeit geändert werden. \begin_layout Standard Wenn ein Querverweis eine nicht existierende Marke referenziert, erscheint in \SpecialChar LyX - „NICHT VORHANDEN“ in der Querverweismarke und in der Ausgabe zwei Fragezeic -hen statt der Referenz. + +\begin_inset Quotes gld +\end_inset + +NICHT VORHANDEN +\begin_inset Quotes grd +\end_inset + + in der Querverweismarke und in der Ausgabe zwei Fragezeichen statt der + Referenz. \end_layout \begin_layout Standard @@ -26372,7 +27537,7 @@ Es gibt zwei Möglichkeiten, in einem \SpecialChar LyX \end_layout \begin_layout Enumerate -Sie können eine Literaturverzeichnis-Datenbank einfügen. +Sie können eine Literaturverzeichnis-Datenbank einfügen \begin_inset Foot status collapsed @@ -26391,7 +27556,7 @@ Bib\SpecialChar TeX \end_inset - Dies wird in Abschnitt +, was in Abschnitt \begin_inset space \space{} \end_inset @@ -26402,8 +27567,7 @@ reference "sec:Literaturverzeichnis-Datenbanken" \end_inset - beschrieben. - . + beschrieben wird. \end_layout \begin_layout Enumerate @@ -26518,7 +27682,15 @@ Marke \family default für einen Eintrag, erscheint die Marke statt der Nummer. Hier sind zwei Beispiele, da erste ohne Marke, das zweite mit der Marke - „Credits“: + +\begin_inset Quotes gld +\end_inset + +Credits +\begin_inset Quotes grd +\end_inset + +: \end_layout \begin_layout Standard @@ -26553,8 +27725,7 @@ key "lyxcredit" Um alle Literatureinträge auszurichten, kann man im Menü \family sans Bearbeiten\SpecialChar menuseparator -Absatz-Ein\SpecialChar softhyphen -stellungen +Absatz-Einstellungen \family default (Werkzeugleistenknopf \begin_inset Info @@ -26674,8 +27845,7 @@ Liste \end_inset Inhaltsverzeichnis\SpecialChar menuseparator -Bib\SpecialChar softhyphen -TeX-Literaturverzeichnis +BibTeX-Literaturverzeichnis \family default , woraufhin das \family sans @@ -26825,9 +27995,7 @@ Literaturverzeichnis \family default die Option \family sans -Ab\SpecialChar softhyphen -schnitt\SpecialChar softhyphen -spezifisches +Abschnittspezifisches \begin_inset space \space{} \end_inset @@ -26912,11 +28080,19 @@ Damit wird die Standardeinstellung überschrieben. \begin_layout Standard Im Dialogfenster können Sie auch Text, der vor oder nach dem Verweis erscheinen soll, festlegen. - Hier erscheint der Text „Kapitel + Hier erscheint der Text +\begin_inset Quotes gld +\end_inset + +Kapitel \begin_inset space \space{} \end_inset -3“ nach dem Verweis: +3 +\begin_inset Quotes grd +\end_inset + + nach dem Verweis: \begin_inset CommandInset citation LatexCommand cite after "Kapitel 3" @@ -26992,10 +28168,18 @@ Stichwortverzeichnis \family default eingefügt. Eine hellblaue Box namens +\begin_inset Quotes gld +\end_inset + + \family sans -„Stichwortverzeichnis +Stichwortverzeichnis \family default -“ zeigt die Stelle an, wo das Stichwortverzeichnis in der Ausgabe erscheinen + +\begin_inset Quotes grd +\end_inset + + zeigt die Stelle an, wo das Stichwortverzeichnis in der Ausgabe erscheinen wird. Die Stichwortverzeichnis-Box ist nicht wie andere \SpecialChar LyX -Boxen anklickbar. @@ -27035,8 +28219,7 @@ Stichworte werden häufig gruppiert, um dem Leser eine schnelle Suche zu ermöglichen. Wenn wir zum Beispiel \emph on -Auf\SpecialChar ligaturebreak -listung +Auflistung \emph default und \emph on @@ -27064,8 +28247,7 @@ Liste . Im Textfeld für das Stichwort \emph on - Auf\SpecialChar ligaturebreak -listung + Auflistung \emph default in Abschnitt \begin_inset space \space{} @@ -27084,8 +28266,7 @@ reference "subsec:Auflistung" \begin_layout Standard \series bold -Liste ! Auf\SpecialChar ligaturebreak -listung +Liste ! Auflistung \end_layout \begin_layout Standard @@ -27119,10 +28300,18 @@ ein. \begin_layout Standard Das Ausrufezeichen +\begin_inset Quotes gld +\end_inset + + \series bold -'! +! \series default -' markiert die Gruppierungsstufe, von denen es drei gibt. + +\begin_inset Quotes grd +\end_inset + + markiert die Gruppierungsstufe, von denen es drei gibt. Jede Stufe wird in der Druckausgabe ein wenig eingerückt. Für eine höhere Stufe ist kein Stichwort nötig, es wird aber trotzdem gedruckt, aber ohne Seitenzahl. @@ -27202,7 +28391,11 @@ Die Befehle \series bold |( \series default -“ und + +\begin_inset Quotes grd +\end_inset + + und \begin_inset Quotes gld \end_inset @@ -27210,7 +28403,11 @@ Die Befehle \series bold |) \series default -“ beginnen bzw. + +\begin_inset Quotes grd +\end_inset + + beginnen bzw. \begin_inset space \space{} \end_inset @@ -27219,7 +28416,15 @@ beenden den Indexbereich. des Dokuments einfügen. Diese erscheinen im Stichwortverzeichnis als ein Stichwort mit einer nachstehen den Liste von Seitenzahlen in denen sich das Stichwort befindet. - Ein Beispiel ist das Stichwort „Dokument ! Einstellungen“. + Ein Beispiel ist das Stichwort +\begin_inset Quotes gld +\end_inset + +Dokument ! Einstellungen +\begin_inset Quotes grd +\end_inset + +. \end_layout \begin_layout Subsection @@ -27338,9 +28543,33 @@ reference "subsec:Stichwort-Programm" \end_inset weiß nicht wie die Akzente in verschiedenen Sprachen einsortiert werden. - Als Beispiel haben wir die drei Stichworte „maison“, „maïs“ und „maître“. + Als Beispiel haben wir die drei Stichworte +\begin_inset Quotes gld +\end_inset + +maison +\begin_inset Quotes grd +\end_inset + +, +\begin_inset Quotes gld +\end_inset + +maïs +\begin_inset Quotes grd +\end_inset + + und +\begin_inset Quotes gld +\end_inset + +maître +\begin_inset Quotes grd +\end_inset + +. \begin_inset Index idx -status open +status collapsed \begin_layout Plain Layout Sinnloseintrag ! maïs @@ -27381,8 +28610,23 @@ voriger Eintrag@aktueller Eintrag \end_layout \begin_layout Standard -In unserem Fall wollen wir „maison“ nach „maïs“ haben und schreiben daher - in das Stichwort von maison: +In unserem Fall wollen wir +\begin_inset Quotes gld +\end_inset + +maison +\begin_inset Quotes grd +\end_inset + + nach +\begin_inset Quotes gld +\end_inset + +maïs +\begin_inset Quotes grd +\end_inset + + haben und schreiben daher in das Stichwort von maison: \end_layout \begin_layout Standard @@ -27450,7 +28694,11 @@ e mit \SpecialChar LaTeX -Paket ! \series default -“ beginnen. + +\begin_inset Quotes grd +\end_inset + + beginnen. Der Grund ist, dass sich das Stichwort für aeguill in einer Fußnote befindet. Um diesen Fehler von \family sans @@ -27511,8 +28759,15 @@ Dies ist ein kursiver Sinnloseintrag \end_inset - Des Weiteren kann die Seitennummer mit dem Befehl „|“, gefolgt von einem - \SpecialChar LaTeX + Des Weiteren kann die Seitennummer mit dem Befehl +\begin_inset Quotes gld +\end_inset + +| +\begin_inset Quotes grd +\end_inset + +, gefolgt von einem \SpecialChar LaTeX -Befehl ohne Backslash, formatiert werden . Man kann zum Beispiel \end_layout @@ -27544,7 +28799,11 @@ Sinnloseintrag ! kursive Seitennummer:|textit \series bold |Befehl \series default -“ + +\begin_inset Quotes grd +\end_inset + + \series bold \backslash @@ -27840,8 +29099,15 @@ Mehrere Stichwortverzeichnisse \begin_layout Standard In vielen Fällen ist es üblich mehr als ein Stichwortverzeichnis zu haben. - Zum Beispiel könnten Sie ein separates Stichwortverzeichnis „Index der - Namen“ neben dem Standard-Stichwortverzeichnis haben wollen. + Zum Beispiel könnten Sie ein separates Stichwortverzeichnis +\begin_inset Quotes gld +\end_inset + +Index der Namen +\begin_inset Quotes grd +\end_inset + + neben dem Standard-Stichwortverzeichnis haben wollen. Mit \SpecialChar LaTeX ist dies nicht direkt möglich, aber es gibt Pakete, die dies ermöglichen. \SpecialChar LyX @@ -27908,7 +29174,15 @@ Mehrere Indexe verwenden \family sans Verfügbare Indexe \family default - bereits den Standard-Index „Stichwortverzeichnis“. + bereits den Standard-Index +\begin_inset Quotes gld +\end_inset + +Stichwortverzeichnis +\begin_inset Quotes grd +\end_inset + +. Um weitere Indexe hinzuzufügen, geben Sie den Namen des Indexes in das Feld \family sans @@ -27957,7 +29231,15 @@ Wenn Sie die Index-Zuweisung eines Indexeintrags ändern wollen, klicken \begin_layout Itemize Durch Rechtsklicken auf einen Index kann man dessen Typ ändern. - Man kann des weiteren einen Index als „Unterindex“ verwenden. + Man kann des weiteren einen Index als +\begin_inset Quotes gld +\end_inset + +Unterindex +\begin_inset Quotes grd +\end_inset + + verwenden. Wenn man das macht, wird die Überschrift des Indexes um eine Ebene verringert. Das bedeutet, dass wenn man z. \begin_inset space \thinspace{} @@ -27965,7 +29247,7 @@ Durch Rechtsklicken auf einen Index kann man dessen Typ ändern. B. eine Buch-Dokumentklasse verwendet, in der der Titel des Stichwortverzeichnisse -s als Kapitel definiert ist, der Titels des Unterindex’ als Abschnitt definiert +s als Kapitel definiert ist, der Titels des Unterindex' als Abschnitt definiert wird und daher in Nicht-Unterindexe eingegliedert werden kann. \end_layout @@ -28136,11 +29418,19 @@ Symbol \end_inset B. - „ + +\begin_inset Quotes gld +\end_inset + + \begin_inset Formula $\sigma$ \end_inset -“ zu bekommen, fügt man dies ein: + +\begin_inset Quotes grd +\end_inset + + zu bekommen, fügt man dies ein: \begin_inset Newline newline \end_inset @@ -28154,12 +29444,28 @@ sigma$ \series default -Das Zeichen '$' beginnt/beendet die Formel. +Das Zeichen +\begin_inset Quotes gld +\end_inset + +$ +\begin_inset Quotes grd +\end_inset + + beginnt/beendet die Formel. Der \SpecialChar LaTeX -Befehl für den griechischen Buchstaben ist dessen Name beginnend mit - einem umgekehrten Schrägstrich ' + einem umgekehrten Schrägstrich +\begin_inset Quotes gld +\end_inset + + \backslash -'. + +\begin_inset Quotes grd +\end_inset + +. Für große griechische Buchstaben beginnt der Befehl mit einem Großbuchstaben: \series bold @@ -28194,11 +29500,19 @@ Textstil Dialog nicht verwenden, um den Beschreibungstext zu formatieren, sondern man muss \SpecialChar LaTeX -Befehle verwenden. - Zum Beispiel lautet die Beschreibung für den Nomenklatureintrag für „ + Zum Beispiel lautet die Beschreibung für den Nomenklatureintrag für +\begin_inset Quotes gld +\end_inset + + \begin_inset Formula $\sigma$ \end_inset -“ in diesem Dokument: + +\begin_inset Quotes grd +\end_inset + + in diesem Dokument: \begin_inset Newline newline \end_inset @@ -28375,17 +29689,33 @@ description "Sinnsloseintrag für das Zeichen \\textsf{sigma}" Symbol \family default steht. - Sie werden daher nach „ + Sie werden daher nach +\begin_inset Quotes gld +\end_inset + + \family sans a \family default -“ und „ + +\begin_inset Quotes grd +\end_inset + + und +\begin_inset Quotes gld +\end_inset + + \family typewriter $ \backslash sigma$ \family default -“ sortiert – das + +\begin_inset Quotes grd +\end_inset + + sortiert – das \begin_inset Formula $\sigma$ \end_inset @@ -28393,7 +29723,15 @@ sigma$ \emph on a \emph default - erscheinen, denn das Befehlszeichen '$' wird bei der Sortierung berücksichtigt. + erscheinen, denn das Befehlszeichen +\begin_inset Quotes gld +\end_inset + +$ +\begin_inset Quotes grd +\end_inset + + wird bei der Sortierung berücksichtigt. \end_layout \begin_layout Standard @@ -28457,18 +29795,34 @@ nomencl \begin_layout Description refeq Verweis mit dem Ausdruck +\begin_inset Quotes gld +\end_inset + + \family sans -„, siehe Gleichung (#) +, siehe Gleichung (#) \family default -“ + +\begin_inset Quotes grd +\end_inset + + \end_layout \begin_layout Description refpage Verweis mit dem Ausdruck +\begin_inset Quotes gld +\end_inset + + \family sans -„, Seite (#) +, Seite (#) \family default -“ + +\begin_inset Quotes grd +\end_inset + + \end_layout \begin_layout Description @@ -28562,8 +29916,16 @@ nomnorefeqpage schaltet die entsprechende Option ab \end_layout \begin_layout Standard -Damit Wörter wie „Seite“ auch auf Deutsch und nicht in Englisch erscheinen, - fügen Sie diese Zeilen dem \SpecialChar LaTeX +Damit Wörter wie +\begin_inset Quotes gld +\end_inset + +Seite +\begin_inset Quotes grd +\end_inset + + auch auf Deutsch und nicht in Englisch erscheinen, fügen Sie diese Zeilen + dem \SpecialChar LaTeX -Vorspann ihres Dokuments hinzu: \end_layout @@ -28632,10 +29994,18 @@ status collapsed Verzeichnis einfügen. An der Stelle erscheint ein Kästchen mit der Aufschrift +\begin_inset Quotes gld +\end_inset + + \family sans -„Nomenklatur +Nomenklatur \family default -“, und dort wird das Verzeichnis auch gedruckt. + +\begin_inset Quotes grd +\end_inset + +, und dort wird das Verzeichnis auch gedruckt. Mit einem Rechtsklick auf das Kästchen kann man die verfügbare Breite für die Symbole einstellen. Sie können dabei zwischen diesen Einstellungen wählen: @@ -28670,7 +30040,15 @@ Benutzerdefiniert benutzerdefinierte Breite \end_layout \begin_layout Standard -In der Druckausgabe erscheint die Nomenklatur als „Nomenclature“. +In der Druckausgabe erscheint die Nomenklatur als +\begin_inset Quotes gld +\end_inset + +Nomenclature +\begin_inset Quotes grd +\end_inset + +. Sie können den Namen im \SpecialChar LaTeX -Vorspann mit dieser Zeile ändern: \end_layout @@ -28833,8 +30211,15 @@ Entfernen \family default . Des Weiteren erlaubt es der Dialog, zwei Zweige miteinander zu vereinen - (einfach einen Zweig in den Namen eines anderen umbenennen) und „unbekannte - Zweige“ (d. + (einfach einen Zweig in den Namen eines anderen umbenennen) und +\begin_inset Quotes gld +\end_inset + +unbekannte Zweige +\begin_inset Quotes grd +\end_inset + + (d. \begin_inset space \thinspace{} \end_inset @@ -28909,13 +30294,88 @@ Zweige \family default aktivieren, wird der Name des aktiven Zweigs beim Export des Dokuments an den Dateinamen angehängt. - Angenommen Sie haben eine Datei namens „Prüfung.lyx“ mit den beiden obigen - Zweigen. - Wenn „Dateinamensendung“ aktiv ist, wird die exportierte PDF-Datei „Prüfung.pdf“ - heißen wenn beide Zweige „Frage“ und „Antwort“ inaktiv waren, „Prüfung-Frage.pdf -“ wenn nur der Zweig „Frage“ aktiv war, „Prüfung-Antwort.pdf“ wenn nur der - Zweig „Antwort“ aktiv war, und „Prüfung-Frage-Antwort.pdf“ wenn beide Zweige - aktiv waren. + Angenommen Sie haben eine Datei namens +\begin_inset Quotes gld +\end_inset + +Prüfung.lyx +\begin_inset Quotes grd +\end_inset + + mit den beiden obigen Zweigen. + Wenn +\begin_inset Quotes gld +\end_inset + +Dateinamensendung +\begin_inset Quotes grd +\end_inset + + aktiv ist, wird die exportierte PDF-Datei +\begin_inset Quotes gld +\end_inset + +Prüfung.pdf +\begin_inset Quotes grd +\end_inset + + heißen wenn beide Zweige +\begin_inset Quotes gld +\end_inset + +Frage +\begin_inset Quotes grd +\end_inset + + und +\begin_inset Quotes gld +\end_inset + +Antwort +\begin_inset Quotes grd +\end_inset + + inaktiv waren, +\begin_inset Quotes eld +\end_inset + +Prüfung-Frage.pdf +\begin_inset Quotes erd +\end_inset + + wenn nur der Zweig +\begin_inset Quotes gld +\end_inset + +Frage +\begin_inset Quotes grd +\end_inset + + aktiv war, +\begin_inset Quotes eld +\end_inset + +Prüfung-Antwort.pdf +\begin_inset Quotes erd +\end_inset + + wenn nur der Zweig +\begin_inset Quotes gld +\end_inset + +Antwort +\begin_inset Quotes grd +\end_inset + + aktiv war, und +\begin_inset Quotes gld +\end_inset + +Prüfung-Frage-Antwort.pdf +\begin_inset Quotes grd +\end_inset + + wenn beide Zweige aktiv waren. Dies hilft um verschiedene Versionen einer Datei zu exportieren ohne den Überblick zu verlieren. \end_layout @@ -29504,8 +30964,7 @@ Geöffnet dargestellt. Um die Darstellung zu ändern, machen Sie einen Rechtsklick auf das Kästchen und wählen in dem Dialogfenster aus, was Sie wollen. - Außerdem können Sie im geöffneten Zustand die Einfügung auf\SpecialChar ligaturebreak -lösen, das heißt, + Außerdem können Sie im geöffneten Zustand die Einfügung auflösen, das heißt, der enthaltenen Text wird normal dargestellt. Wenn das Kästchen geschlossen ist, öffnet ein Linksklick es. \end_layout @@ -29546,7 +31005,7 @@ fbox{ \begin_layout Standard \begin_inset Graphics - filename ../clipart/ERT.png + filename clipart/ERT.png scale 75 \end_inset @@ -29624,7 +31083,15 @@ Wenn Sie größere Dokumente oder Bücher schreiben, müssen Sie etwas über -Befehle wissen, die \SpecialChar LyX im Hintergrund verwendet. Da \SpecialChar LaTeX - auf Befehlen basiert, können Sie Ihren Text „programmieren“. + auf Befehlen basiert, können Sie Ihren Text +\begin_inset Quotes gld +\end_inset + +programmieren +\begin_inset Quotes grd +\end_inset + +. Dies hat den Vorteil, dass das Aussehen des Dokuments jederzeit geändert werden kann, wenn man die richtigen Befehle kennt. Stellen Sie sich zum Beispiel vor, dass Sie ein Handbuch für ein Produkt @@ -29956,7 +31423,7 @@ status open \begin_layout Plain Layout \SpecialChar LyX -’ +' \family sans \series bold \color red @@ -30055,7 +31522,15 @@ Dokument\SpecialChar menuseparator Einstellungen\SpecialChar menuseparator Module \family default - das Modul „Benutzerdefinierte Kopf/Fußzeilen“ hinzu. + das Modul +\begin_inset Quotes gld +\end_inset + +Benutzerdefinierte Kopf/Fußzeilen +\begin_inset Quotes grd +\end_inset + + hinzu. Dieses Modul bietet die 6 \begin_inset space ~ \end_inset @@ -30340,7 +31815,15 @@ Achtung \family sans Seiten-Stil \family default - auf „Standard“ gesetzt ist. + auf +\begin_inset Quotes gld +\end_inset + +Standard +\begin_inset Quotes grd +\end_inset + + gesetzt ist. Daher sollten Sie deren Stil ausprobieren bevor Sie eigenen Kopf-/Fußzeilen definieren. \end_layout @@ -30404,7 +31887,15 @@ roman{page} druckt die aktuelle Seitennummer in kleinen römischen Ziffern leftmark druckt die aktuelle Abschnittsnummer und dessen Titel. Besitzt das Dokument Kapitel, druckt es stattdessen die Kapitelnummer und dessen Name. - Es heißt „leftmark“, da man es üblicherweise links in der Kopfzeile verwendet. + Es heißt +\begin_inset Quotes pld +\end_inset + +leftmark +\begin_inset Quotes prd +\end_inset + +, da man es üblicherweise links in der Kopfzeile verwendet. \end_layout \begin_layout Description @@ -30673,7 +32164,7 @@ Fußzeile \end_inset Mitte \SpecialChar LyX -’ +' \family sans \series bold \color red @@ -31275,7 +32766,7 @@ Quelltext-Panel Das Fenster zeigt den Quellcode des gesamten Absatzes, indem sich der Cursor momentan befindet. Man kann auch Dokumentteile in \SpecialChar LyX -’ Hauptfenster markieren, dann wird nur +' Hauptfenster markieren, dann wird nur der Code der Auswahl angezeigt (wenn es mehr als ein Absatz ist). Um das gesamte Dokument als Quellcode anzusehen, verwendet man die entsprechend e Option im Quellcode-Fenster. @@ -31403,7 +32894,7 @@ ersetzen \family sans Umschalt \family default -+F) oder den Werkzeugleistenknopf ++F oder den Werkzeugleistenknopf \begin_inset Info type "icon" arg "dialog-toggle findreplaceadv" @@ -31487,10 +32978,10 @@ Suchen Wenn nach Formeln gesucht wird, werden diese gefunden, wenn sie allein stehen, aber auch wenn sie Teil einer Formel sind. Zum Beispiel werden die beiden Beispiele in dieser Formel gefunden: -\begin_inset Formula $\frac{x^{2}}{\sqrt{\frac{x^{2}}{1+x^{2}}}}$ +\begin_inset Formula $\frac{x^{2}}{\sqrt{\frac{x^{2}}{1+x^{2}}}}.$ \end_inset -. + \end_layout \begin_layout Subsubsection @@ -31607,8 +33098,15 @@ das Ersetzen mit einer formatierten Version des selben Wortes, z. \end_inset B. - Ersetzen des Namens „func()“ mit seiner Version im Stil Schreibmaschine - + Ersetzen des Namens +\begin_inset Quotes gld +\end_inset + +func() +\begin_inset Quotes grd +\end_inset + + mit seiner Version im Stil Schreibmaschine \begin_inset Quotes gld \end_inset @@ -31616,7 +33114,11 @@ B. \family typewriter func() \family default -“ + +\begin_inset Quotes grd +\end_inset + + \end_layout \begin_layout Itemize @@ -31625,15 +33127,31 @@ func() \end_inset B. - um alle Vorkommen von „ + um alle Vorkommen von +\begin_inset Quotes gld +\end_inset + + \begin_inset Formula $R$ \end_inset -“ mit „ + +\begin_inset Quotes grd +\end_inset + + mit +\begin_inset Quotes gld +\end_inset + + \begin_inset Formula $\mathbb{R}$ \end_inset -“ zu ersetzen (dabei hilft es eventuell, die Optionen + +\begin_inset Quotes grd +\end_inset + + zu ersetzen (dabei hilft es eventuell, die Optionen \family sans Ganze Wörter \family default @@ -31649,8 +33167,15 @@ Ignoriere Format \family sans Einstellungen \family default - zu deaktivieren, um zu verhindern, dass alle „R“ im normalen Text ersetzt - werden), oder + zu deaktivieren, um zu verhindern, dass alle +\begin_inset Quotes eld +\end_inset + +R +\begin_inset Quotes erd +\end_inset + + im normalen Text ersetzt werden), oder \begin_inset Formula $x_{j}^{i}$ \end_inset @@ -31926,7 +33451,7 @@ Alle von \SpecialChar LyX \begin_inset Flex URL -status open +status collapsed \begin_layout Plain Layout @@ -31946,7 +33471,7 @@ Es gibt 2 Dateien für jede Sprache. Um ein Wörterbuch unter Windows zu installieren, kopiert man beide Dateien in \SpecialChar LyX -’ Installationsunterordner +' Installationsunterordner \family sans ~ \backslash @@ -32003,7 +33528,7 @@ hunspell \family typewriter enchant \begin_inset Foot -status open +status collapsed \begin_layout Plain Layout Enchant selbst ist eine Hüllbibliothek mit verschiedenen konfigurierbaren @@ -32065,7 +33590,14 @@ Wörter \begin_inset space ~ \end_inset -akzeptieren Verhindert, dass zusammengesetzte Wörter wie „Verzeichnisname“ +akzeptieren Verhindert, dass zusammengesetzte Wörter wie +\begin_inset Quotes gld +\end_inset + +Verzeichnisname +\begin_inset Quotes erd +\end_inset + moniert werden. \end_layout @@ -32233,7 +33765,7 @@ Thesaurus-Wörterbücher \family default ) nur noch mitteilen, wo sie gespeichert sind. \begin_inset Foot -status open +status collapsed \begin_layout Plain Layout Unter Linux sind die üblichen Orte (abhängig von Ihrer Distribution und @@ -32594,7 +34126,7 @@ Farbe ! Änderungsverfolgung \end_inset Der Autor und das Datum der Änderung werden in \SpecialChar LyX -’ Statusleiste angezeigt, +' Statusleiste angezeigt, wenn sich der Cursor in geändertem Text befindet. Die selbe Information erhalten Sie, wenn Sie den Werkzeugleistenknopf \begin_inset Info @@ -33510,8 +35042,15 @@ Importieren Man kann hier Dateien von älteren \SpecialChar LyX -Versionen, HTML-Dateien, \SpecialChar LaTeX -Dateien, NoWeb-Date -ien, einfache Textdateien und „Komma-getrennte“, tabellenartige Textdateien - (CSV) importieren. +ien, einfache Textdateien und +\begin_inset Quotes gld +\end_inset + +Komma-getrennte +\begin_inset Quotes grd +\end_inset + +, tabellenartige Textdateien (CSV) importieren. Die Dateien werden als neues \SpecialChar LyX -Dokument importiert. \end_layout @@ -33831,7 +35370,23 @@ LyX z.y.x \SpecialChar LyX -Dokument in einem Format, das von der \SpecialChar LyX -Version z.y.x lesbar ist. - (z und y repräsentieren die Versionsnummer) + ( +\begin_inset Quotes gld +\end_inset + +z +\begin_inset Quotes grd +\end_inset + + und +\begin_inset Quotes gld +\end_inset + +y +\begin_inset Quotes grd +\end_inset + + repräsentieren die Versionsnummer) \end_layout \begin_layout Description @@ -33984,8 +35539,7 @@ PDF \begin_inset space ~ \end_inset -Auf\SpecialChar ligaturebreak -lösung) wie +Auflösung) wie \family sans PDF \begin_inset space ~ @@ -33993,8 +35547,7 @@ PDF (pdflatex) \family default - aber mit einer reduzierten Pixel-Auf\SpecialChar ligaturebreak -lösung von 150 + aber mit einer reduzierten Pixel-Auflösung von 150 \begin_inset space \thinspace{} \end_inset @@ -34167,7 +35720,7 @@ Fax \begin_layout Standard Dieses Menü erscheint nur, wenn ein Faxprogramm installiert ist (bei Windows muss zusätzlich dessen Programmpfad zu \SpecialChar LyX -’ PATH-Präfix hinzugefügt werden, +' PATH-Präfix hinzugefügt werden, siehe Abschnitt \begin_inset space ~ \end_inset @@ -34191,7 +35744,7 @@ kdeprintfax senden. Das voreingestellte Format der gesendeten Datei ist PostScript. Das Format kann in \SpecialChar LyX -’ Grundeinstellungen, wie in Abschnitt +' Grundeinstellungen, wie in Abschnitt \begin_inset space ~ \end_inset @@ -34407,8 +35960,7 @@ Diese Menüs sind nur aktiv, wenn sich der Cursor in einer Tabelle befindet. \end_layout \begin_layout Subsection -Einfügung auf\SpecialChar ligaturebreak -lösen +Einfügung auflösen \end_layout \begin_layout Standard @@ -34684,7 +36236,7 @@ Tabelle ist. \begin_layout Standard \SpecialChar LyX -’ Werkzeugleisten und ihre Knöpfe sind in Abschnitt +' Werkzeugleisten und ihre Knöpfe sind in Abschnitt \begin_inset space ~ \end_inset @@ -34732,7 +36284,7 @@ Hälfte teilen \family default teilt \SpecialChar LyX -’ Hauptfenster vertikal, +' Hauptfenster vertikal, \family sans Ansicht \begin_inset space ~ @@ -35515,8 +37067,15 @@ Benutzerdefinierte Einfügungen Fügt dokumentklassen-spezifische Einfügungen ein. Solche Einfügungen existieren nur, wenn sie in der Layout-Datei der Dokumentkla sse definiert sind. - Ein Beispiel ist die Dokumentklasse „article (Elsevier)“ mit drei benutzerdefin -ierten Einfügungen. + Ein Beispiel ist die Dokumentklasse +\begin_inset Quotes gld +\end_inset + +article (Elsevier) +\begin_inset Quotes grd +\end_inset + + mit drei benutzerdefinierten Einfügungen. Der Abschnitt \emph on Flexible Einfügungen und InsetLayout @@ -37640,7 +39199,7 @@ arg "textstyle-apply" \begin_inset Text \begin_layout Plain Layout -Formatiert Text mit der aktuellen Einstellungen des +Formatiert Text unter Benutzung der aktuellen Einstellungen des \family sans Bearbeiten\SpecialChar menuseparator Textstil @@ -39066,7 +40625,15 @@ Suchen \end_inset B. - nach „Seite“ suchen, werden einige Untermenüs ausgegraut und deaktiviert. + nach +\begin_inset Quotes gld +\end_inset + +Seite +\begin_inset Quotes grd +\end_inset + + suchen, werden einige Untermenüs ausgegraut und deaktiviert. Nur Untermenüs mit Seiteneinstellungen bleiben aktiviert. In diesen Untermenüs werden die Seiteneinstellungen rot hervorgehoben. \end_layout @@ -39102,7 +40669,7 @@ Lokales Format \family default können Sie eine eigene Layout-Datei laden, die sich nicht in \SpecialChar LyX -’ +' \emph on layouts \emph default @@ -39534,7 +41101,15 @@ Sprachpaket \family default legt das \SpecialChar LaTeX -Paket fest, das für die Silbentrennung und Übersetzung von Ausdrücken - wie „Teil“ verwendet wird. + wie +\begin_inset Quotes gld +\end_inset + +Teil +\begin_inset Quotes grd +\end_inset + + verwendet wird. Die möglichen Einstellungen sind: \end_layout @@ -41106,13 +42681,11 @@ Objekte \end_layout \begin_layout Section -Auf\SpecialChar ligaturebreak -listungszeichen +Auflistungszeichen \end_layout \begin_layout Standard -Hier können Sie die Zeichen für die verschiedenen Auf\SpecialChar ligaturebreak -listungs- +Hier können Sie die Zeichen für die verschiedenen Auflistungs- \family sans Ebenen \family default @@ -41124,8 +42697,7 @@ Schrift \family sans Größe \family default - der Auf\SpecialChar ligaturebreak -listungszeichen angeben. + der Auflistungszeichen angeben. Die Auflistung-Umgebung ist in Abschnitt \begin_inset space ~ \end_inset @@ -41263,8 +42835,39 @@ Ausgabeformat: Das Format, welches verwendet wird, wenn Sie im Menü \family sans Dokument \family default - oder der Werkzeugleiste „Ansehen“, „Aktualisieren“, „Hauptdokument ansehen“ - oder „Hauptdokument aktualisieren“ anklicken. + oder der Werkzeugleiste +\begin_inset Quotes gld +\end_inset + +Ansehen +\begin_inset Quotes grd +\end_inset + +, +\begin_inset Quotes gld +\end_inset + +Aktualisieren +\begin_inset Quotes grd +\end_inset + +, +\begin_inset Quotes gld +\end_inset + +Hauptdokument ansehen +\begin_inset Quotes grd +\end_inset + + oder +\begin_inset Quotes gld +\end_inset + +Hauptdokument aktualisieren +\begin_inset Quotes grd +\end_inset + + anklicken. Die Standard-Einstellung wird in \family sans Werkzeuge\SpecialChar menuseparator @@ -41517,7 +43120,15 @@ Separator \family sans Icon \family default - und im Fall des Menüs „file_lastfiles“ einen + und im Fall des Menüs +\begin_inset Quotes gld +\end_inset + +file_lastfiles +\begin_inset Quotes grd +\end_inset + + einen \family sans Lastfiles \family default @@ -41531,12 +43142,28 @@ Lastfiles \series bold -Item „Menü +Item +\begin_inset Quotes eld +\end_inset + +Menü \series default oder \series bold - Knopfname“ „\SpecialChar LyX --Funktion“ + Knopfname +\begin_inset Quotes erd +\end_inset + + +\begin_inset Quotes eld +\end_inset + +\SpecialChar LyX +-Funktion +\begin_inset Quotes erd +\end_inset + + \end_layout \begin_layout Standard @@ -41576,7 +43203,23 @@ Lesezeichen \series bold -Item „Lesezeichen 6 speichern“ „bookmark-save 6“ +Item +\begin_inset Quotes eld +\end_inset + +Lesezeichen 6 speichern +\begin_inset Quotes erd +\end_inset + + +\begin_inset Quotes eld +\end_inset + +bookmark-save 6 +\begin_inset Quotes erd +\end_inset + + \end_layout \begin_layout Standard @@ -41584,7 +43227,15 @@ Item „Lesezeichen 6 speichern“ „bookmark-save 6“ \begin_inset VSpace smallskip* \end_inset -zum Menü „navigate_bookmarks“ in der Datei +zum Menü +\begin_inset Quotes gld +\end_inset + +navigate_bookmarks +\begin_inset Quotes grd +\end_inset + + in der Datei \emph on stdmenus.inc \emph default @@ -41597,7 +43248,7 @@ Mit Symboldesign \family default kann das Aussehen von \SpecialChar LyX -’ Werkzeugleisten geändert werden. +' Werkzeugleisten geändert werden. Die derzeit verfügbaren Symboldesigns sind in \begin_inset CommandInset href LatexCommand href @@ -41659,7 +43310,7 @@ Mit der Option Aussehen und Größe von Fenstern wiederherstellen \family default wird \SpecialChar LyX -’ Hauptfenster mit der Größe und dem Aussehen geöffnet, das in der +' Hauptfenster mit der Größe und dem Aussehen geöffnet, das in der letzten \SpecialChar LyX -Sitzung benutzt wurde. \end_layout @@ -42339,7 +43990,15 @@ broadway.bind \shape default , und für Sprachen. Der Name einer Tastaturkürzel-Datei für Sprachen beginnt mit dem Sprach-Code, - zum Beispiel „pt“ für Portugiesisch. + zum Beispiel +\begin_inset Quotes gld +\end_inset + +pt +\begin_inset Quotes grd +\end_inset + + für Portugiesisch. Wenn Sie \SpecialChar LyX für eine spezielle Sprache benutzen, wird es die entsprechende Tastaturkürzel-Datei benutzen. @@ -42458,8 +44117,15 @@ textstyle-apply Ein vorhandenes Tastaturkürzel wird ebenso geändert. Sie auch mehrere Funktionen einem Tastaturkürzel zuordnen, indem Sie die \SpecialChar LyX --Funktion mit „command alternatives“ beginnen und die verschiedenen Funktionen, - durch Kommas getrennt, anfügen. +-Funktion mit +\begin_inset Quotes gld +\end_inset + +command alternatives +\begin_inset Quotes grd +\end_inset + + beginnen und die verschiedenen Funktionen, durch Kommas getrennt, anfügen. \SpecialChar LyX wird dann für das Tastaturkürzel die erste Funktion benutzen, die im gerade bearbeiteten Dokumentteil aktiv ist. @@ -42480,8 +44146,24 @@ Alternativ können Sie natürlich auch die entsprechende Tastaturkürzel-Datei \series bold \backslash -bind „Tastaturkürzel“ „\SpecialChar LyX --Funktion“ +bind +\begin_inset Quotes gld +\end_inset + +Tastaturkürzel +\begin_inset Quotes grd +\end_inset + + +\begin_inset Quotes gld +\end_inset + +\SpecialChar LyX +-Funktion +\begin_inset Quotes grd +\end_inset + + \end_layout \begin_layout Subsection @@ -42780,7 +44462,15 @@ Arbeitsverzeichnis \begin_inset Newline newline \end_inset -Sicherungsdateien haben die Endung „.lyx~“. +Sicherungsdateien haben die Endung +\begin_inset Quotes gld +\end_inset + +.lyx~ +\begin_inset Quotes grd +\end_inset + +. \end_layout \begin_layout Description @@ -43016,7 +44706,7 @@ der \end_inset Benutzeroberfläche Hier kann die Sprache der \SpecialChar LyX -’ Menüs eingestellt werden. +' Menüs eingestellt werden. Der aktuelle Übersetzungsstatus ist hier zu finden: \begin_inset Newline newline \end_inset @@ -43036,7 +44726,19 @@ Sprachpaket legt fest, welches \SpecialChar LaTeX -Paket für die Sprachunterstützung geladen werden soll. Zur Sprachunterstützung zählen Silbentrennmuster ebenso wie die Lokalisation - von Daten und von Klassen verwendeten Ausdrücken wie „Kapitel“ und „Tabelle“. + von Daten und von Klassen verwendeten Ausdrücken wie +\begin_inset Quotes gld +\end_inset + +Kapitel +\begin_inset Quotes grd +\end_inset + + und Tabelle +\begin_inset Quotes grd +\end_inset + +. Das verbreitetste Sprachpaket ist \series bold babel @@ -43163,7 +44865,7 @@ Standard-Dezimaltrenner Legen Sie hier den Standard-Dezimaltrenner fest, \begin_layout Description Standard-Längeneinheit Legt die Einheit fest, die als Voreinstellung für Längen in \SpecialChar LyX -’ Dialogen verwendet wird. +' Dialogen verwendet wird. \end_layout \begin_layout Description @@ -43524,10 +45226,18 @@ X2 \family default werden für Kyrillisch verwendet. Kombinationen der Kodierungen wie +\begin_inset Quotes gld +\end_inset + + \family sans -„T1, T2B +T1, T2B \family default -“ sind möglich. + +\begin_inset Quotes grd +\end_inset + + sind möglich. Die Schriftkodierung wird normalerweise automatisch von den Sprachpaketen geladen, die \SpecialChar LyX im Hintergund verwendet. @@ -43647,9 +45357,25 @@ in \SpecialChar LaTeX -Dateien Verwendet Pfade in der Notation von Windows; das bedeutet, dass - ' + +\begin_inset Quotes gld +\end_inset + + \backslash -' anstelle von '/' verwendet wird, um Verzeichnisse zu trennen. + +\begin_inset Quotes grd +\end_inset + + anstelle von +\begin_inset Quotes gld +\end_inset + +/ +\begin_inset Quotes grd +\end_inset + + verwendet wird, um Verzeichnisse zu trennen. Diese Option ist automatisch aktiv unter \SpecialChar LyX für Windows. \begin_inset Index idx @@ -43873,7 +45599,7 @@ Anpassung \begin_layout Standard Da alle Konvertierungen von einem Format in ein anderes in \SpecialChar LyX -’ temporärem +' temporärem Verzeichnis stattfinden, ist es manchmal notwendig eine Datei zu modifizieren, bevor sie ins temporäre Verzeichnis kopiert und dort konvertiert wird. Dies geschieht, indem man einen @@ -45898,7 +47624,7 @@ set_width "auto" \begin_layout Standard \begin_inset Note Note -status open +status collapsed \begin_layout Plain Layout Damit der Index den Namen @@ -45967,8 +47693,7 @@ indexname name \series default . - Eine Auf\SpecialChar ligaturebreak -listung der möglichen Namen findet man unter + Eine Auflistung der möglichen Namen findet man unter \end_layout \begin_layout Plain Layout From 65a6cc1fc3bc71a53e6f004a9b18e8dd1d32ecf2 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Tue, 24 May 2016 12:08:24 +0200 Subject: [PATCH 74/76] Cleanup of spacing in mathed This is a first cleanup step. More complex rules have to be implemented on top of this. Use proper spacing \thinmuskip, \medmuskip and \thickmuskip instead of ad-hoc values. Rename isRelOp to isMathRel and introduce isMathBin and isMathPunct (for InsetMathChar and InsetMathSymbol). Update the categories of characters in InsetMathChar according to LaTeX source (fontmath.ltx). Set correctly the spacing around mathrel, mathbin and mathpunct elements. Use \thinmuskip around MathDelim instead of a hardcoded 4. This is related to bug #8883. --- src/mathed/InsetMath.h | 8 +++++-- src/mathed/InsetMathChar.cpp | 44 +++++++++++++++++++++------------- src/mathed/InsetMathChar.h | 6 ++++- src/mathed/InsetMathDelim.cpp | 9 +++---- src/mathed/InsetMathHull.cpp | 2 +- src/mathed/InsetMathSymbol.cpp | 41 +++++++++++++++++++++---------- src/mathed/InsetMathSymbol.h | 6 ++++- src/mathed/MathSupport.cpp | 41 +++++++++++++++++++++++++++++++ src/mathed/MathSupport.h | 6 +++++ 9 files changed, 125 insertions(+), 38 deletions(-) diff --git a/src/mathed/InsetMath.h b/src/mathed/InsetMath.h index b23ffb5179..088fce6c2b 100644 --- a/src/mathed/InsetMath.h +++ b/src/mathed/InsetMath.h @@ -162,8 +162,12 @@ public: /// identifies things that can get scripts virtual bool isScriptable() const { return false; } - /// is the a relational operator (used for splitting equations) - virtual bool isRelOp() const { return false; } + /// identifies a binary operators (used for spacing) + virtual bool isMathBin() const { return false; } + /// identifies relational operators (used for spacing and splitting equations) + virtual bool isMathRel() const { return false; } + /// identifies punctuation (used for spacing) + virtual bool isMathPunct() const { return false; } /// will this get written as a single block in {..} virtual bool extraBraces() const { return false; } diff --git a/src/mathed/InsetMathChar.cpp b/src/mathed/InsetMathChar.cpp index 713e1353e6..2879ac91fc 100644 --- a/src/mathed/InsetMathChar.cpp +++ b/src/mathed/InsetMathChar.cpp @@ -26,7 +26,6 @@ #include "support/debug.h" #include "support/lstrings.h" -#include "support/lyxlib.h" #include "support/textutils.h" @@ -35,12 +34,6 @@ namespace lyx { extern bool has_math_fonts; -static bool isBinaryOp(char_type c) -{ - return support::contains("+-<>=/*", static_cast(c)); -} - - static bool slanted(char_type c) { return isAlphaASCII(c) || Encodings::isMathAlpha(c); @@ -76,11 +69,15 @@ void InsetMathChar::metrics(MetricsInfo & mi, Dimension & dim) const dim = fm.dimension(char_); kerning_ = fm.rbearing(char_) - dim.wid; } - int const em = mathed_font_em(mi.base.font); - if (isBinaryOp(char_)) - dim.wid += support::iround(0.5 * em); + if (isMathBin()) + dim.wid += 2 * mathed_medmuskip(mi.base.font); + else if (isMathRel()) + dim.wid += 2 * mathed_thickmuskip(mi.base.font); + else if (isMathPunct()) + dim.wid += mathed_thinmuskip(mi.base.font); else if (char_ == '\'') - dim.wid += support::iround(0.1667 * em); + // FIXME: don't know where this is coming from + dim.wid += mathed_thinmuskip(mi.base.font); #else whichFont(font_, code_, mi); dim = theFontMetrics(font_).dimension(char_); @@ -94,11 +91,12 @@ void InsetMathChar::metrics(MetricsInfo & mi, Dimension & dim) const void InsetMathChar::draw(PainterInfo & pi, int x, int y) const { //lyxerr << "drawing '" << char_ << "' font: " << pi.base.fontname << std::endl; - int const em = mathed_font_em(pi.base.font); - if (isBinaryOp(char_)) - x += support::iround(0.25 * em); + if (isMathBin()) + x += mathed_medmuskip(pi.base.font); + else if (isMathRel()) + x += mathed_thickmuskip(pi.base.font); else if (char_ == '\'') - x += support::iround(0.0833 * em); + x += mathed_thinmuskip(pi.base.font) / 2; #if 1 if (char_ == '=' && has_math_fonts) { FontSetChanger dummy(pi.base, "cmr"); @@ -237,9 +235,21 @@ void InsetMathChar::htmlize(HtmlStream & ms) const } -bool InsetMathChar::isRelOp() const +bool InsetMathChar::isMathBin() const { - return char_ == '=' || char_ == '<' || char_ == '>'; + return support::contains("+-*", static_cast(char_)); +} + + +bool InsetMathChar::isMathRel() const +{ + return support::contains("<>=:", static_cast(char_)); +} + + +bool InsetMathChar::isMathPunct() const +{ + return support::contains(",;", static_cast(char_)); } diff --git a/src/mathed/InsetMathChar.h b/src/mathed/InsetMathChar.h index 65fac82fff..67bbc64e8c 100644 --- a/src/mathed/InsetMathChar.h +++ b/src/mathed/InsetMathChar.h @@ -49,7 +49,11 @@ public: /// char_type getChar() const { return char_; } /// - bool isRelOp() const; + bool isMathBin() const; + /// + bool isMathRel() const; + /// + bool isMathPunct() const; /// InsetCode lyxCode() const { return MATH_CHAR_CODE; } diff --git a/src/mathed/InsetMathDelim.cpp b/src/mathed/InsetMathDelim.cpp index 8e8b6e295b..b10d37ad69 100644 --- a/src/mathed/InsetMathDelim.cpp +++ b/src/mathed/InsetMathDelim.cpp @@ -115,7 +115,7 @@ void InsetMathDelim::metrics(MetricsInfo & mi, Dimension & dim) const dw_ = 8; if (dw_ < 4) dw_ = 4; - dim.wid = dim0.width() + 2 * dw_ + 8; + dim.wid = dim0.width() + 2 * dw_ + 2 * mathed_thinmuskip(mi.base.font); dim.asc = max(a0, d0) + h0; dim.des = max(a0, d0) - h0; } @@ -125,9 +125,10 @@ void InsetMathDelim::draw(PainterInfo & pi, int x, int y) const { Dimension const dim = dimension(*pi.base.bv); int const b = y - dim.asc; - cell(0).draw(pi, x + dw_ + 4, y); - mathed_draw_deco(pi, x + 4, b, dw_, dim.height(), left_); - mathed_draw_deco(pi, x + dim.width() - dw_ - 4, + int const skip = mathed_thinmuskip(pi.base.font); + cell(0).draw(pi, x + dw_ + skip, y); + mathed_draw_deco(pi, x + skip, b, dw_, dim.height(), left_); + mathed_draw_deco(pi, x + dim.width() - dw_ - skip, b, dw_, dim.height(), right_); setPosCache(pi, x, y); } diff --git a/src/mathed/InsetMathHull.cpp b/src/mathed/InsetMathHull.cpp index 48792a81ae..34955147e2 100644 --- a/src/mathed/InsetMathHull.cpp +++ b/src/mathed/InsetMathHull.cpp @@ -106,7 +106,7 @@ namespace { size_t firstRelOp(MathData const & ar) { for (MathData::const_iterator it = ar.begin(); it != ar.end(); ++it) - if ((*it)->isRelOp()) + if ((*it)->isMathRel()) return it - ar.begin(); return ar.size(); } diff --git a/src/mathed/InsetMathSymbol.cpp b/src/mathed/InsetMathSymbol.cpp index a160dec684..a04f6e0bcf 100644 --- a/src/mathed/InsetMathSymbol.cpp +++ b/src/mathed/InsetMathSymbol.cpp @@ -21,7 +21,6 @@ #include "support/debug.h" #include "support/docstream.h" -#include "support/lyxlib.h" #include "support/textutils.h" #include @@ -68,7 +67,6 @@ void InsetMathSymbol::metrics(MetricsInfo & mi, Dimension & dim) const sym_->extra == "mathalpha" && mi.base.fontname == "mathit"; std::string const font = italic_upcase_greek ? "cmm" : sym_->inset; - int const em = mathed_font_em(mi.base.font); FontSetChanger dummy(mi.base, from_ascii(font)); mathed_string_dim(mi.base.font, sym_->draw, dim); docstring::const_reverse_iterator rit = sym_->draw.rbegin(); @@ -80,10 +78,15 @@ void InsetMathSymbol::metrics(MetricsInfo & mi, Dimension & dim) const dim.des -= h_; } // seperate things a bit - if (isRelOp()) - dim.wid += support::iround(0.5 * em); - else - dim.wid += support::iround(0.1667 * em); + if (isMathBin()) + dim.wid += 2 * mathed_medmuskip(mi.base.font); + else if (isMathRel()) + dim.wid += 2 * mathed_thickmuskip(mi.base.font); + else if (isMathPunct()) + dim.wid += mathed_thinmuskip(mi.base.font); + // FIXME: I see no reason for this + //else + // dim.wid += support::iround(0.1667 * em); scriptable_ = false; if (mi.base.style == LM_ST_DISPLAY) @@ -105,11 +108,13 @@ void InsetMathSymbol::draw(PainterInfo & pi, int x, int y) const sym_->extra == "mathalpha" && pi.base.fontname == "mathit"; std::string const font = italic_upcase_greek ? "cmm" : sym_->inset; - int const em = mathed_font_em(pi.base.font); - if (isRelOp()) - x += support::iround(0.25 * em); - else - x += support::iround(0.0833 * em); + if (isMathBin()) + x += mathed_medmuskip(pi.base.font); + else if (isMathRel()) + x += mathed_thickmuskip(pi.base.font); + // FIXME: I see no reason for this + //else + // x += support::iround(0.0833 * em); FontSetChanger dummy(pi.base, from_ascii(font)); pi.draw(x, y - h_, sym_->draw); @@ -122,12 +127,24 @@ InsetMath::mode_type InsetMathSymbol::currentMode() const } -bool InsetMathSymbol::isRelOp() const +bool InsetMathSymbol::isMathBin() const +{ + return sym_->extra == "mathbin"; +} + + +bool InsetMathSymbol::isMathRel() const { return sym_->extra == "mathrel"; } +bool InsetMathSymbol::isMathPunct() const +{ + return sym_->extra == "mathpunct"; +} + + bool InsetMathSymbol::isOrdAlpha() const { return sym_->extra == "mathord" || sym_->extra == "mathalpha"; diff --git a/src/mathed/InsetMathSymbol.h b/src/mathed/InsetMathSymbol.h index bb18217a84..6ca3ded7d1 100644 --- a/src/mathed/InsetMathSymbol.h +++ b/src/mathed/InsetMathSymbol.h @@ -40,7 +40,11 @@ public: /// mode_type currentMode() const; /// - bool isRelOp() const; + bool isMathRel() const; + /// + bool isMathBin() const; + /// + bool isMathPunct() const; /// bool isOrdAlpha() const; /// do we take scripts? diff --git a/src/mathed/MathSupport.cpp b/src/mathed/MathSupport.cpp index 9801151129..7769176e7a 100644 --- a/src/mathed/MathSupport.cpp +++ b/src/mathed/MathSupport.cpp @@ -25,6 +25,7 @@ #include "support/debug.h" #include "support/docstream.h" +#include "support/lyxlib.h" #include #include @@ -506,6 +507,46 @@ int mathed_font_em(FontInfo const & font) return theFontMetrics(font).em(); } +/* The math units. Quoting TeX by Topic, p.205: + * + * Spacing around mathematical objects is measured in mu units. A mu + * is 1/18th part of \fontdimen6 of the font in family 2 in the + * current style, the ‘quad’ value of the symbol font. + * + * A \thickmuskip (default value in plain TeX: 5mu plus 5mu) is + * inserted around (binary) relations, except where these are preceded + * or followed by other relations or punctuation, and except if they + * follow an open, or precede a close symbol. + * + * A \medmuskip (default value in plain TeX: 4mu plus 2mu minus 4mu) + * is put around binary operators. + * + * A \thinmuskip (default value in plain TeX: 3mu) follows after + * punctuation, and is put around inner objects, except where these + * are followed by a close or preceded by an open symbol, and except + * if the other object is a large operator or a binary relation. + */ + +int mathed_thinmuskip(FontInfo font) +{ + font.setFamily(SYMBOL_FAMILY); + return support::iround(3.0 / 18 * theFontMetrics(font).em()); +} + + +int mathed_medmuskip(FontInfo font) +{ + font.setFamily(SYMBOL_FAMILY); + return support::iround(4.0 / 18 * theFontMetrics(font).em()); +} + + +int mathed_thickmuskip(FontInfo font) +{ + font.setFamily(SYMBOL_FAMILY); + return support::iround(5.0 / 18 * theFontMetrics(font).em()); +} + int mathed_char_width(FontInfo const & font, char_type c) { diff --git a/src/mathed/MathSupport.h b/src/mathed/MathSupport.h index aa5ef2adc2..c14f21a807 100644 --- a/src/mathed/MathSupport.h +++ b/src/mathed/MathSupport.h @@ -29,6 +29,12 @@ class InsetMath; int mathed_font_em(FontInfo const &); +int mathed_thinmuskip(FontInfo font); + +int mathed_medmuskip(FontInfo font); + +int mathed_thickmuskip(FontInfo font); + int mathed_char_width(FontInfo const &, char_type c); int mathed_char_kerning(FontInfo const &, char_type c); From d30fe45f4c721bb9fe4d750fba127ddd6652e95a Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Wed, 25 May 2016 15:14:18 +0200 Subject: [PATCH 75/76] Fixup 1b2aad9 : Cleanup of spacing in mathed Now that 5mu are added on each side of : (because it is a relation), there is no need to do the same in the definition of \vcentcolon. This is closer to what is done in mathtools.sty. --- lib/symbols | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/symbols b/lib/symbols index 6106b46a3b..279e64ecf0 100644 --- a/lib/symbols +++ b/lib/symbols @@ -1103,7 +1103,7 @@ pod lyxblacktext 0 0 func x amsmath # mathtools.sty -\def\vcentcolon{\kern4mu:\kern3mu} mathtools +\def\vcentcolon{:} mathtools \def\dblcolon{\vcentcolon\kern-8mu\vcentcolon} mathtools \def\coloneqq{\vcentcolon\kern-7mu=} mathtools \def\Coloneqq{\dblcolon\kern-7mu=} mathtools From 82e0ad3efa4f494b965f91dcc24cd15952cf0cbc Mon Sep 17 00:00:00 2001 From: Kornel Benko Date: Thu, 26 May 2016 22:36:35 +0200 Subject: [PATCH 76/76] Correct wrong path for included lyx-file Although the fix affects only a content of a LyX note, it is still surprising to get a dialog-window demanding creation a new document if trying to edit the subdocument. --- lib/doc/MergedManuals.lyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/doc/MergedManuals.lyx b/lib/doc/MergedManuals.lyx index 44cbae87de..cf72312c36 100644 --- a/lib/doc/MergedManuals.lyx +++ b/lib/doc/MergedManuals.lyx @@ -233,7 +233,7 @@ filename "../examples/linguistics.lyx" \begin_layout Plain Layout \begin_inset CommandInset include LatexCommand include -filename "../lib/examples/xypic.lyx" +filename "../examples/xypic.lyx" \end_inset