Initial commit: Klammertext source distribution

Curated source subset assembled by klammertext-dev's doc/make_dist.sh: the Klammermachine (mac), the Standard Klammer Set (sks), the commands (com), editor plugins and install guides (doc), a test subset (tst), and lib/bin placeholders. Builds with 'make -C com'.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-18 18:48:23 +02:00
commit 2ba7ceee7a
272 changed files with 27634 additions and 0 deletions

86
sks/document/document.cpp Normal file
View File

@@ -0,0 +1,86 @@
#include "document_class.h"
#include "latex_util.h"
#include "machine.h"
#include "show.h"
#include "log.h"
// extern "C" is needed for dlsym name lookup. Returning std::string from
// C-linkage functions is technically non-standard but works correctly on
// Linux (Itanium ABI) where C and C++ calling conventions are identical.
#if defined(__clang__)
#pragma clang diagnostic ignored "-Wreturn-type-c-linkage"
#endif
extern "C"
std::string document(Machine& machine)
{
(void)K::log(3);
try {
Document_class D(machine);
return D.result();
}
catch (Error& err) {
err.print_message();
std::cout << "\n";
exit(1);
}
}
extern "C"
std::string tex_to_pdf(Machine& machine)
{
(void)K::log(3);
try {
check_for_xelatex();
std::string outbase = machine.m_state.value("K_output_dir")
+ "/" + machine.m_state.value("K_output_basename");
std::string tex_filename = outbase + ".tex";
for (auto ext : {"aux", "log", "out", "toc"}) {
fs::remove(outbase + "." + ext);
}
std::string command = "xelatex -interaction=batchmode -halt-on-error " + tex_filename;
string_to_file(tex_filename, machine.m_result);
std::string xelatex_output = exec(command.c_str());
std::string xelatex_log = string_from_file(outbase + ".log");
std::vector<std::string> error_lines = find_latex_error_lines(xelatex_log);
if (!error_lines.empty()) {
std::stringstream ss {};
ss << "Errors reported in xelatex log file:\n";
for (auto line : error_lines) {
ss << " " << line << "\n";
}
ss << "Check log file: " << outbase << ".log";
throw Definition_error(ss.str(), Locator(), false);
}
if (std::regex_search(xelatex_log, std::regex("Package rerunfilecheck Warning:"))) {
(void)K::log(1, "Rerunning xelatex because document structure has changed");
xelatex_output = exec(command.c_str());
xelatex_log = string_from_file(outbase + ".log");
error_lines = find_latex_error_lines(xelatex_log);
if (!error_lines.empty()) {
std::stringstream ss {};
ss << "Errors reported in xelatex log file:\n";
for (auto line : error_lines) {
ss << " " << line << "\n";
}
ss << "Check log file: " << outbase << ".log";
throw Definition_error(ss.str(), Locator(), false);
}
}
/*
if (std::stoi(machine.m_state.value("K_verbose_level")) < 2) {
for (auto ext : word_split("tex out aux log toc")) {
fs::remove(outbase + "." + ext);
}
}
*/
return "";
}
catch (Error& err) {
std::cout << red;
err.print_message();
std::cout << black << "\n";
exit(1);
}
}