Add support for multiple indexes in Memoir

As with almost everything, this class bakes its own cake also with
multiple indexes. So we need to account for this to produce
compilable output.

Not very nice, but there you go!
This commit is contained in:
Juergen Spitzmueller 2024-07-26 12:48:12 +02:00
parent fe1a3b57df
commit d4f58c96b5
9 changed files with 87 additions and 9 deletions

View File

@ -18,6 +18,8 @@ PageSize letter
Provides makeidx 1
Provides framed 1
Provides subscript 1
# Memoir has its own implementation
Provides memoir-idx 1
# Geometry is supported, but the package options and paper sizes
# are ignored
Provides geometry-light 1

View File

@ -1886,6 +1886,7 @@ Buffer::ExportStatus Buffer::writeLaTeXSource(otexstream & os,
runparams.use_hyperref = features.isRequired("hyperref")
|| features.isProvided("hyperref");
runparams.use_CJK = features.mustProvide("CJK");
runparams.use_memindex = features.isProvided("memoir-idx");
}
LYXERR(Debug::OUTFILE, " Buffer validation done.");
@ -4220,6 +4221,7 @@ unique_ptr<TexRow> Buffer::getSourceCode(odocstream & os, string const & format,
runparams.use_babel = features.useBabel();
runparams.use_hyperref = features.isRequired("hyperref")
|| features.isProvided("hyperref");
runparams.use_memindex = features.isProvided("memoir-idx");
// latex or literate
otexstream ots(os);
// output above

View File

@ -2279,9 +2279,17 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
// Additional Indices
if (features.isRequired("splitidx")) {
for (auto const & idx : indiceslist()) {
os << "\\newindex{";
if (features.isProvided("memoir-idx")) {
if (idx.shortcut() == "idx")
continue;
os << "\\makeindex[";
} else
os << "\\newindex{";
os << escape(idx.shortcut());
os << "}\n";
if (features.isProvided("memoir-idx"))
os << "]\n";
else
os << "}\n";
}
}

View File

@ -21,6 +21,7 @@
#include "Format.h"
#include "InsetList.h"
#include "Language.h"
#include "LaTeXFeatures.h"
#include "LaTeX.h"
#include "LyXRC.h"
#include "Mover.h"
@ -555,6 +556,15 @@ Converters::RetVal Converters::convert(Buffer const * buffer,
"tmpfile.out"));
}
if (buffer && buffer->params().use_indices && conv.latex()) {
// We need to validate the buffer to get access to features.
// FIXME Not nice that we need to do this here.
LYXERR(Debug::OUTFILE, " Validating buffer...");
LaTeXFeatures features(*buffer, buffer->params(), runparams);
buffer->validate(features);
runparams.use_memindex = features.isProvided("memoir-idx");
}
if (buffer && buffer->params().use_minted
&& lyxrc.pygmentize_command.empty() && conv.latex()) {
bool dowarn = false;

View File

@ -20,6 +20,7 @@
#include "Buffer.h"
#include "BufferList.h"
#include "BufferParams.h"
#include "IndicesList.h"
#include "LyXRC.h"
#include "LyX.h"
#include "DepTable.h"
@ -466,6 +467,41 @@ int LaTeX::run(TeXErrors & terr)
iscanres = scanIlgFile(terr);
rerun = true;
}
// This is Memoir's multi-index idiosyncracy
if (runparams.use_indices && runparams.use_memindex) {
Buffer const * buf = theBufferList().getBufferFromTmp(file.absFileName());
if (buf) {
IndicesList const & indiceslist = buf->params().indiceslist();
if (!indiceslist.empty()) {
IndicesList::const_iterator it = indiceslist.begin();
IndicesList::const_iterator const end = indiceslist.end();
for (; it != end; ++it) {
docstring const & ci = it->shortcut();
if (ci == "idx")
continue;
FileName const aidxfile(to_utf8(ci + ".idx"));
LYXERR(Debug::OUTFILE, "Running Index Processor for " << ci);
message(_("Running Index Processor."));
// onlyFileName() is needed for cygwin
int const ret =
runMakeIndex(onlyFileName(aidxfile.absFileName()), runparams);
if (ret == Systemcall::KILLED || ret == Systemcall::TIMEOUT)
return ret;
else if (ret != Systemcall::OK) {
iscanres |= INDEX_ERROR;
terr.insertError(0,
_("Index Processor Error"),
_("The index processor did not run successfully. "
"Please check the output of View > Messages Pane!"));
}
FileName const ailgfile(changeExtension(aidxfile.absFileName(), ".ilg"));
if (ailgfile.exists())
iscanres = scanIlgFile(terr, ailgfile);
rerun = true;
}
}
}
}
if (run_nomencl) {
int const ret = runMakeIndexNomencl(file, ".nlo", ".nls");
if (ret == Systemcall::KILLED || ret == Systemcall::TIMEOUT)
@ -592,7 +628,7 @@ int LaTeX::runMakeIndex(string const & f, OutputParams const & rp,
tmp = subst(tmp, "$$lang", doc_lang->babel());
tmp = subst(tmp, "$$lcode", doc_lang->code());
}
if (rp.use_indices) {
if (rp.use_indices && !rp.use_memindex) {
tmp = lyxrc.splitindex_command + " -m " + quoteName(tmp);
LYXERR(Debug::OUTFILE,
"Multiple indices. Using splitindex command: " << tmp);
@ -1640,9 +1676,11 @@ int LaTeX::scanBlgFile(DepTable & dep, TeXErrors & terr)
}
int LaTeX::scanIlgFile(TeXErrors & terr)
int LaTeX::scanIlgFile(TeXErrors & terr, FileName const fn)
{
FileName const ilg_file(changeExtension(file.absFileName(), "ilg"));
FileName const ilg_file = fn.empty()
? FileName(changeExtension(file.absFileName(), "ilg"))
: fn;
LYXERR(Debug::OUTFILE, "Scanning ilg file: " << ilg_file);
ifstream ifs(ilg_file.toFilesystemEncoding().c_str());

View File

@ -230,7 +230,7 @@ private:
int scanBlgFile(DepTable & head, TeXErrors & terr);
///
int scanIlgFile(TeXErrors & terr);
int scanIlgFile(TeXErrors & terr, support::FileName const fn = support::FileName());
///
bool runBibTeX(std::vector<AuxInfo> const &,

View File

@ -1360,7 +1360,7 @@ string const LaTeXFeatures::getPackages() const
if (isRequired("makeidx") || isRequired("splitidx")) {
if (!isProvided("makeidx") && !isRequired("splitidx"))
packages << "\\usepackage{makeidx}\n";
if (mustProvide("splitidx"))
if (mustProvide("splitidx") && !isProvided("memoir-idx"))
packages << "\\usepackage{splitidx}\n";
packages << "\\makeindex\n";
}

View File

@ -223,6 +223,11 @@ public:
*/
bool use_indices = false;
/** Are we using the memoir way to
* to multiple indices?
*/
bool use_memindex = false;
/** Are we using japanese (pLaTeX)?
*/
bool use_japanese = false;

View File

@ -142,7 +142,10 @@ void InsetIndex::latex(otexstream & ios, OutputParams const & runparams_in) cons
if (buffer().masterBuffer()->params().use_indices && !params_.index.empty()
&& params_.index != "idx") {
os << "\\sindex[";
if (runparams.use_memindex)
os << "\\index[";
else
os << "\\sindex[";
os << escape(params_.index);
os << "]{";
} else {
@ -1406,7 +1409,17 @@ void InsetPrintIndex::latex(otexstream & os, OutputParams const & runparams_in)
return;
}
OutputParams runparams = runparams_in;
os << getCommand(runparams);
if (runparams.use_memindex) {
if (getParam("type") == from_ascii("idx"))
os << "\\printindex" << termcmd;
else {
os << "\\begingroup" << breakln;
os << "\\renewcommand{\\indexname}{" << getParam("name") << "}" << breakln;
os << "\\printindex[" << getParam("type") << "]" << breakln;
os << "\\endgroup" << breakln;
}
} else
os << getCommand(runparams);
}