#include "convertlatex.h" #include #include #include #include static std::string latex_escape (const std::string &s) { std::string out; out.reserve (s.size() + s.size() / 8); for (unsigned char ch : s) { switch (ch) { case '\\': out += "\\textbackslash{}"; break; case '{': out += "\\{"; break; case '}': out += "\\}"; break; case '%': out += "\\%"; break; case '$': out += "\\$"; break; case '#': out += "\\#"; break; case '&': out += "\\&"; break; case '_': out += "\\_"; break; case '^': out += "\\textasciicircum{}"; break; case '~': out += "\\textasciitilde{}"; break; default: out.push_back (static_cast (ch)); break; } } return out; } bool ConverterLatex::save (const std::string &output_file_name) { if (!parse()) return false; std::ofstream output (output_file_name, std::ios::trunc); if (!output.is_open()) { std::cerr << "Failed to open output file: " << output_file_name << " (" << std::strerror (errno) << ")\n"; set_error_code (3); return false; } const auto &book_titles = titles(); for (std::size_t i = 0; i < book_titles.size(); ++i) { const auto &title = book_titles[i]; output << "\\section {" << latex_escape (title) << "}\n"; for (std::size_t quote_index = 0; quote_index < quote_count (title); ++quote_index) { output << " \\subsection {" << latex_escape (quote_meta (title, quote_index)) << "}\n"; for (const auto &text_line : quote_text_lines (title, quote_index)) output << " " << latex_escape (text_line) << "\n"; output << " \\subsubsection{notes}\n\n"; } if (i + 1 < book_titles.size()) output << "\n"; } set_error_code (0); return true; }