Skip to main content

The latexgen.cpp File Reference

Included Headers

#include <cstdlib> #include "latexgen.h" #include "config.h" #include "message.h" #include "doxygen.h" #include "util.h" #include "diagram.h" #include "language.h" #include "version.h" #include "dot.h" #include "dotcallgraph.h" #include "dotclassgraph.h" #include "dotdirdeps.h" #include "dotgroupcollaboration.h" #include "dotincldepgraph.h" #include "pagedef.h" #include "docparser.h" #include "docnode.h" #include "latexdocvisitor.h" #include "dirdef.h" #include "cite.h" #include "groupdef.h" #include "classlist.h" #include "namespacedef.h" #include "filename.h" #include "resourcemgr.h" #include "portable.h" #include "fileinfo.h" #include "utf8.h" #include "datetime.h" #include "outputlist.h" #include "moduledef.h"

Functions Index

static QCStringsubstituteLatexKeywords (const QCString &file, const QCString &str, const QCString &title)
static voidwriteLatexMakefile ()
static voidwriteMakeBat ()
static voidwriteDefaultStyleSheet (TextStream &t)
static QCStringextraLatexStyleSheet ()
static QCStringmakeIndex ()
static QCStringlatex_batchmode ()
static QCStringobjectLinkToString (const QCString &ref, const QCString &f, const QCString &anchor, const QCString &text, bool insideTabbing, bool disableLinks)
static voidprocessEntity (TextStream &t, bool pdfHyperlinks, const char *strForm, const char *strRepl)
voidwriteExtraLatexPackages (TextStream &t)
voidwriteLatexSpecialFormulaChars (TextStream &t)
voidfilterLatexString (TextStream &t, const QCString &str, bool insideTabbing, bool insidePre, bool insideItem, bool insideTable, bool keepSpaces, const bool retainNewline)
QCStringconvertToLaTeX (const QCString &s, bool insideTabbing, bool keepSpaces)
QCStringlatexEscapeLabelName (const QCString &s)
QCStringlatexEscapeIndexChars (const QCString &s)
QCStringlatexEscapePDFString (const QCString &s)
QCStringlatexFilterURL (const QCString &s)

Variables Index

static QCStringg_header
static QCStringg_header_file
static QCStringg_footer
static QCStringg_footer_file
static const SelectionMarkerInfolatexMarkerInfo = { '%', "%%BEGIN ",8 ,"%%END ",6, "",0 }

Macro Definitions Index

#defineCOPYCHAR()   ...

Functions

convertToLaTeX()

QCString convertToLaTeX (const QCString & s, bool insideTabbing, bool keepSpaces)

Definition at line 2546 of file latexgen.cpp.

2546QCString convertToLaTeX(const QCString &s,bool insideTabbing,bool keepSpaces)
2547{
2548 TextStream t;
2549 filterLatexString(t,s,insideTabbing,false,false,false,keepSpaces);
2550 return t.str();
2551}

References filterLatexString and TextStream::str.

Referenced by LatexGenerator::endIndexSection, objectLinkToString, LatexGenerator::startIndexSection, substituteLatexKeywords and LatexGenerator::writeInheritedSectionTitle.

extraLatexStyleSheet()

QCString extraLatexStyleSheet ()
static

Definition at line 736 of file latexgen.cpp.

737{
738 QCString result;
739 const StringVector &extraLatexStyles = Config_getList(LATEX_EXTRA_STYLESHEET);
740 for (const auto &fileName : extraLatexStyles)
741 {
742 if (!fileName.empty())
743 {
744 FileInfo fi(fileName);
745 if (fi.exists())
746 {
747 result += "\\usepackage{";
749 {
750 // strip the extension, it will be added by the usepackage in the tex conversion process
752 }
753 else
754 {
755 result += fi.fileName();
756 }
757 result += "}\n";
758 }
759 }
760 }
761 return result;
762}

References checkExtension, Config_getList, FileInfo::exists, FileInfo::fileName, LATEX_STYLE_EXTENSION and stripExtensionGeneral.

Referenced by substituteLatexKeywords.

filterLatexString()

void filterLatexString (TextStream & t, const QCString & str, bool insideTabbing, bool insidePre, bool insideItem, bool insideTable, bool keepSpaces, const bool retainNewline)

Definition at line 2388 of file latexgen.cpp.

2389 bool insideTabbing,bool insidePre,bool insideItem,bool insideTable,bool keepSpaces, const bool retainNewline)
2390{
2391 if (str.isEmpty()) return;
2392 bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
2393 //printf("filterLatexString(%s) insideTabbing=%d\n",qPrint(str),insideTabbing);
2394 const char *p = str.data();
2395 const char *q = nullptr;
2396 unsigned char pc='\0';
2397
2398 while (*p)
2399 {
2400 unsigned char c=static_cast<unsigned char>(*p++);
2401
2402 if (insidePre)
2403 {
2404 switch(c)
2405 {
2406 case 0xef: // handle U+FFFD i.e. "Replacement character" caused by octal: 357 277 275 / hexadecimal 239 191 189
2407 // the LaTeX command \ucr has been defined in doxygen.sty
2408 if (static_cast<unsigned char>(*(p)) == 191 && static_cast<unsigned char>(*(p+1)) == 0xbd)
2409 {
2410 t << "{\\ucr}";
2411 p += 2;
2412 }
2413 else
2414 t << static_cast<char>(c);
2415 break;
2416 case '\\': t << "\\(\\backslash\\)"; break;
2417 case '{': t << "\\{"; break;
2418 case '}': t << "\\}"; break;
2419 case '_': t << "\\_"; break;
2420 case '&': t << "\\&"; break;
2421 case '%': t << "\\%"; break;
2422 case '#': t << "\\#"; break;
2423 case '$': t << "\\$"; break;
2424 case '"': t << "\"{}"; break;
2425 case '-': t << "-\\/"; break;
2426 case '^': insideTable ? t << "\\string^" : t << static_cast<char>(c); break;
2427 case '~': t << "\\string~"; break;
2428 case '\n': if (retainNewline) t << "\\newline"; else t << ' ';
2429 break;
2430 case ' ': if (keepSpaces) t << "~"; else t << ' ';
2431 break;
2432 default:
2433 if (c<32) t << ' '; // non printable control character
2434 else t << static_cast<char>(c);
2435 break;
2436 }
2437 }
2438 else
2439 {
2440 switch(c)
2441 {
2442 case 0xef: // handle U+FFFD i.e. "Replacement character" caused by octal: 357 277 275 / hexadecimal 239 191 189
2443 // the LaTeX command \ucr has been defined in doxygen.sty
2444 if (static_cast<unsigned char>(*(p)) == 191 && static_cast<unsigned char>(*(p+1)) == 0xbd)
2445 {
2446 t << "{\\ucr}";
2447 p += 2;
2448 }
2449 else
2450 t << static_cast<char>(c);
2451 break;
2452 case '#': t << "\\#"; break;
2453 case '$': t << "\\$"; break;
2454 case '%': t << "\\%"; break;
2455 case '^': processEntity(t,pdfHyperlinks,"$^\\wedge$","\\string^"); break;
2456 case '&': {
2457 // possibility to have a special symbol
2458 q = p;
2459 int cnt = 2; // we have to count & and ; as well
2460 while ((*q >= 'a' && *q <= 'z') || (*q >= 'A' && *q <= 'Z') || (*q >= '0' && *q <= '9'))
2461 {
2462 cnt++;
2463 q++;
2464 }
2465 if (*q == ';')
2466 {
2467 --p; // we need & as well
2470 {
2471 p++;
2472 t << "\\&";
2473 }
2474 else
2475 {
2477 q++;
2478 p = q;
2479 }
2480 }
2481 else
2482 {
2483 t << "\\&";
2484 }
2485 }
2486 break;
2487 case '*': processEntity(t,pdfHyperlinks,"$\\ast$","*"); break;
2488 case '_': if (!insideTabbing) t << "\\+";
2489 t << "\\_";
2490 if (!insideTabbing) t << "\\+";
2491 break;
2492 case '{': t << "\\{"; break;
2493 case '}': t << "\\}"; break;
2494 case '<': t << "$<$"; break;
2495 case '>': t << "$>$"; break;
2496 case '|': processEntity(t,pdfHyperlinks,"$\\vert$","|"); break;
2497 case '~': processEntity(t,pdfHyperlinks,"$\\sim$","\\string~"); break;
2498 case '[': if (Config_getBool(PDF_HYPERLINKS) || insideItem)
2499 t << "\\mbox{[}";
2500 else
2501 t << "[";
2502 break;
2503 case ']': if (pc=='[') t << "$\\,$";
2504 if (Config_getBool(PDF_HYPERLINKS) || insideItem)
2505 t << "\\mbox{]}";
2506 else
2507 t << "]";
2508 break;
2509 case '-': t << "-\\/";
2510 break;
2511 case '\\': t << "\\textbackslash{}";
2512 break;
2513 case '"': t << "\"{}";
2514 break;
2515 case '`': t << "\\`{}";
2516 break;
2517 case '\'': t << "\\textquotesingle{}";
2518 break;
2519 case '\n': if (retainNewline) t << "\\newline"; else t << ' ';
2520 break;
2521 case ' ': if (keepSpaces) { if (insideTabbing) t << "\\>"; else t << '~'; } else t << ' ';
2522 break;
2523
2524 default:
2525 //if (!insideTabbing && forceBreaks && c!=' ' && *p!=' ')
2526 if (!insideTabbing &&
2527 ((c>='A' && c<='Z' && pc!=' ' && !(pc>='A' && pc <= 'Z') && pc!='\0' && *p) || (c==':' && pc!=':') || (pc=='.' && isId(c)))
2528 )
2529 {
2530 t << "\\+";
2531 }
2532 if (c<32)
2533 {
2534 t << ' '; // non-printable control character
2535 }
2536 else
2537 {
2538 t << static_cast<char>(c);
2539 }
2540 }
2541 }
2542 pc = c;
2543 }
2544}

References Config_getBool, QCString::data, insideTable, HtmlEntityMapper::instance, QCString::isEmpty, isId, HtmlEntityMapper::latex, HtmlEntityMapper::name2sym, processEntity and HtmlEntityMapper::Sym_Unknown.

Referenced by LatexCodeGenerator::codify, convertToLaTeX, LatexGenerator::docify, LatexDocVisitor::filter, latexEscapeIndexChars, latexEscapeLabelName and substituteLatexKeywords.

latex_batchmode()

QCString latex_batchmode ()
static

Definition at line 782 of file latexgen.cpp.

783{
784 switch (Config_getEnum(LATEX_BATCHMODE))
785 {
786 case LATEX_BATCHMODE_t::NO: return "";
787 case LATEX_BATCHMODE_t::YES: return "\\batchmode";
788 case LATEX_BATCHMODE_t::BATCH: return "\\batchmode";
789 case LATEX_BATCHMODE_t::NON_STOP: return "\\nonstopmode";
790 case LATEX_BATCHMODE_t::SCROLL: return "\\scrollmode";
791 case LATEX_BATCHMODE_t::ERROR_STOP: return "\\errorstopmode";
792 }
793 return "";
794}

Reference Config_getEnum.

Referenced by substituteLatexKeywords.

latexEscapeIndexChars()

QCString latexEscapeIndexChars (const QCString & s)

Definition at line 2598 of file latexgen.cpp.

2599{
2600 //printf("latexEscapeIndexChars(%s)\n",qPrint(s));
2601 if (s.isEmpty()) return s;
2603 TextStream t;
2604 const char *p=s.data();
2605 char c = 0;
2606 while ((c=*p++))
2607 {
2608 switch (c)
2609 {
2610 case '!': t << "\"!"; break;
2611 case '"': t << "\"\""; break;
2612 case '@': t << "\"@"; break;
2613 case '|': t << "\\texttt{\"|}"; break;
2614 case '[': t << "["; break;
2615 case ']': t << "]"; break;
2616 case '{': t << "\\lcurly{}"; break;
2617 case '}': t << "\\rcurly{}"; break;
2618 // NOTE: adding a case here, means adding it to while below as well!
2619 default:
2620 {
2621 int i=0;
2622 // collect as long string as possible, before handing it to docify
2623 tmp[i++]=c;
2624 while ((c=*p) && c!='"' && c!='@' && c!='[' && c!=']' && c!='!' && c!='{' && c!='}' && c!='|')
2625 {
2626 tmp[i++]=c;
2627 p++;
2628 }
2629 tmp[i]=0;
2630 filterLatexString(t,tmp,
2631 true, // insideTabbing
2632 false, // insidePre
2633 false, // insideItem
2634 false, // insideTable
2635 false // keepSpaces
2636 );
2637 }
2638 break;
2639 }
2640 }
2641 return t.str();
2642}

References QCString::data, QCString::ExplicitSize, filterLatexString, QCString::isEmpty, QCString::length and TextStream::str.

Referenced by LatexGenerator::addIndexItem, LatexGenerator::endTitleHead, LatexDocVisitor::operator() and LatexGenerator::startMemberDoc.

latexEscapeLabelName()

QCString latexEscapeLabelName (const QCString & s)

Definition at line 2553 of file latexgen.cpp.

2554{
2555 //printf("latexEscapeLabelName(%s)\n",qPrint(s));
2556 if (s.isEmpty()) return s;
2558 TextStream t;
2559 const char *p=s.data();
2560 char c = 0;
2561 while ((c=*p++))
2562 {
2563 switch (c)
2564 {
2565 case '|': t << "\\texttt{\"|}"; break;
2566 case '!': t << "\"!"; break;
2567 case '@': t << "\"@"; break;
2568 case '%': t << "\\%"; break;
2569 case '{': t << "\\lcurly{}"; break;
2570 case '}': t << "\\rcurly{}"; break;
2571 case '~': t << "````~"; break; // to get it a bit better in index together with other special characters
2572 // NOTE: adding a case here, means adding it to while below as well!
2573 default:
2574 {
2575 int i=0;
2576 // collect as long string as possible, before handing it to docify
2577 tmp[i++]=c;
2578 while ((c=*p) && c!='@' && c!='[' && c!=']' && c!='!' && c!='{' && c!='}' && c!='|')
2579 {
2580 tmp[i++]=c;
2581 p++;
2582 }
2583 tmp[i]=0;
2584 filterLatexString(t,tmp,
2585 true, // insideTabbing
2586 false, // insidePre
2587 false, // insideItem
2588 false, // insideTable
2589 false // keepSpaces
2590 );
2591 }
2592 break;
2593 }
2594 }
2595 return t.str();
2596}

References QCString::data, QCString::ExplicitSize, filterLatexString, QCString::isEmpty, QCString::length and TextStream::str.

Referenced by LatexGenerator::addIndexItem, LatexGenerator::endTitleHead, LatexDocVisitor::operator() and LatexGenerator::startMemberDoc.

latexEscapePDFString()

QCString latexEscapePDFString (const QCString & s)

Definition at line 2644 of file latexgen.cpp.

2645{
2646 if (s.isEmpty()) return s;
2647 TextStream t;
2648 const char *p=s.data();
2649 char c = 0;
2650 while ((c=*p++))
2651 {
2652 switch (c)
2653 {
2654 case '\\': t << "\\textbackslash{}"; break;
2655 case '{': t << "\\{"; break;
2656 case '}': t << "\\}"; break;
2657 case '_': t << "\\_"; break;
2658 case '%': t << "\\%"; break;
2659 case '&': t << "\\&"; break;
2660 case '#': t << "\\#"; break;
2661 case '$': t << "\\$"; break;
2662 case '^': t << "\\string^"; break;
2663 case '~': t << "\\string~"; break;
2664 default:
2665 t << c;
2666 break;
2667 }
2668 }
2669 return t.str();
2670}

References QCString::data, QCString::isEmpty and TextStream::str.

Referenced by LatexGenerator::startMemberDoc.

latexFilterURL()

QCString latexFilterURL (const QCString & s)

Definition at line 2672 of file latexgen.cpp.

2673{
2674 constexpr auto hex = "0123456789ABCDEF";
2675 if (s.isEmpty()) return s;
2676 TextStream t;
2677 const char *p=s.data();
2678 char c = 0;
2679 while ((c=*p++))
2680 {
2681 switch (c)
2682 {
2683 case '#': t << "\\#"; break;
2684 case '%': t << "\\%"; break;
2685 case '\\': t << "\\\\"; break;
2686 default:
2687 if (c<0)
2688 {
2689 unsigned char id = static_cast<unsigned char>(c);
2690 t << "\\%" << hex[id>>4] << hex[id&0xF];
2691 }
2692 else
2693 {
2694 t << c;
2695 }
2696 break;
2697 }
2698 }
2699 return t.str();
2700}

References QCString::data, hex, QCString::isEmpty and TextStream::str.

Referenced by LatexDocVisitor::operator() and LatexDocVisitor::operator().

makeIndex()

QCString makeIndex ()
static

Definition at line 764 of file latexgen.cpp.

765{
766 QCString result;
767 QCString latex_mkidx_command = Config_getString(LATEX_MAKEINDEX_CMD);
768 if (!latex_mkidx_command.isEmpty())
769 {
770 if (latex_mkidx_command[0] == '\\')
771 result += latex_mkidx_command;
772 else
773 result += "\\"+latex_mkidx_command;
774 }
775 else
776 {
777 result += "\\makeindex";
778 }
779 return result;
780}

References Config_getString and QCString::isEmpty.

Referenced by substituteLatexKeywords.

objectLinkToString()

QCString objectLinkToString (const QCString & ref, const QCString & f, const QCString & anchor, const QCString & text, bool insideTabbing, bool disableLinks)
static

Definition at line 1405 of file latexgen.cpp.

1405static QCString objectLinkToString(const QCString &ref, const QCString &f,
1406 const QCString &anchor, const QCString &text,
1407 bool insideTabbing,bool disableLinks)
1408{
1409 bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
1410 QCString result;
1411 if (!disableLinks && ref.isEmpty() && pdfHyperlinks)
1412 {
1413 result += "\\mbox{\\hyperlink{";
1414 if (!f.isEmpty()) result += stripPath(f);
1415 if (!f.isEmpty() && !anchor.isEmpty()) result += "_";
1416 if (!anchor.isEmpty()) result += anchor;
1417 result += "}{";
1418 result += convertToLaTeX(text,insideTabbing);
1419 result += "}}";
1420 }
1421 else
1422 {
1423 result += "\\textbf{ ";
1424 result += convertToLaTeX(text,insideTabbing);
1425 result += "}";
1426 }
1427 return result;
1428}

References Config_getBool, convertToLaTeX, QCString::isEmpty and stripPath.

processEntity()

void processEntity (TextStream & t, bool pdfHyperlinks, const char * strForm, const char * strRepl)
static

Definition at line 1430 of file latexgen.cpp.

1430static void processEntity(TextStream &t, bool pdfHyperlinks, const char *strForm, const char *strRepl)
1431{
1432 if (pdfHyperlinks)
1433 {
1434 t << "\\texorpdfstring{";
1435 }
1436 t << strForm;
1437 if (pdfHyperlinks)
1438 {
1439 t << "}{" << strRepl << "}";
1440 }
1441}

Referenced by filterLatexString.

substituteLatexKeywords()

QCString substituteLatexKeywords (const QCString & file, const QCString & str, const QCString & title)
static

Definition at line 796 of file latexgen.cpp.

797 const QCString &str,
798 const QCString &title)
799{
800 bool compactLatex = Config_getBool(COMPACT_LATEX);
801 bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
802 bool usePdfLatex = Config_getBool(USE_PDFLATEX);
803 QCString paperType = Config_getEnumAsString(PAPER_TYPE);
804
805 QCString style = Config_getString(LATEX_BIB_STYLE);
806 if (style.isEmpty())
807 {
808 style="plainnat";
809 }
810
811 TextStream tg;
812 QCString generatedBy;
813 auto timeStamp = Config_getEnum(TIMESTAMP);
814 switch (timeStamp)
815 {
816 case TIMESTAMP_t::YES:
817 case TIMESTAMP_t::DATETIME:
818 generatedBy = theTranslator->trGeneratedAt(dateToString(DateTimeType::DateTime),
819 Config_getString(PROJECT_NAME));
820 break;
821 case TIMESTAMP_t::DATE:
822 generatedBy = theTranslator->trGeneratedAt(dateToString(DateTimeType::Date),
823 Config_getString(PROJECT_NAME));
824 break;
825 case TIMESTAMP_t::NO:
826 generatedBy = theTranslator->trGeneratedBy();
827 break;
828 }
829 filterLatexString(tg, generatedBy,
830 false, // insideTabbing
831 false, // insidePre
832 false, // insideItem
833 false, // insideTable
834 false // keepSpaces
835 );
836 generatedBy = tg.str();
837
838 QCString latexFontenc = theTranslator->latexFontenc();
839
840 QCString latexEmojiDirectory = Config_getString(LATEX_EMOJI_DIRECTORY);
841 if (latexEmojiDirectory.isEmpty()) latexEmojiDirectory = ".";
842 latexEmojiDirectory = substitute(latexEmojiDirectory,"\\","/");
843
844 TextStream tg1;
846 QCString extraLatexPackages = tg1.str();
847
848 TextStream tg2;
850 QCString latexSpecialFormulaChars = tg2.str();
851
852 QCString formulaMacrofile = Config_getString(FORMULA_MACROFILE);
853 QCString stripMacroFile;
854 if (!formulaMacrofile.isEmpty())
855 {
856 FileInfo fi(formulaMacrofile.str());
857 formulaMacrofile=fi.absFilePath();
858 stripMacroFile = fi.fileName();
859 copyFile(formulaMacrofile,Config_getString(LATEX_OUTPUT) + "/" + stripMacroFile);
860 }
861
862 QCString projectNumber = Config_getString(PROJECT_NUMBER);
863
864 // first substitute generic keywords
865 QCString result = substituteKeywords(file,str,title,
866 convertToLaTeX(Config_getString(PROJECT_NAME),false),
867 convertToLaTeX(projectNumber,false),
868 convertToLaTeX(Config_getString(PROJECT_BRIEF),false));
869
870 // additional LaTeX only keywords
871 result = substituteKeywords(file,result,
872 {
873 // keyword value getter
874 { "$latexdocumentpre", [&]() { return theTranslator->latexDocumentPre(); } },
875 { "$latexdocumentpost", [&]() { return theTranslator->latexDocumentPost(); } },
876 { "$generatedby", [&]() { return generatedBy; } },
877 { "$latexbibstyle", [&]() { return style; } },
878 { "$latexcitereference", [&]() { return theTranslator->trCiteReferences(); } },
879 { "$latexbibfiles", [&]() { return CitationManager::instance().latexBibFiles(); } },
880 { "$papertype", [&]() { return paperType+"paper"; } },
881 { "$extralatexstylesheet", [&]() { return extraLatexStyleSheet(); } },
882 { "$languagesupport", [&]() { return theTranslator->latexLanguageSupportCommand(); } },
883 { "$latexfontenc", [&]() { return latexFontenc; } },
884 { "$latexfont", [&]() { return theTranslator->latexFont(); } },
885 { "$latexemojidirectory", [&]() { return latexEmojiDirectory; } },
886 { "$makeindex", [&]() { return makeIndex(); } },
887 { "$extralatexpackages", [&]() { return extraLatexPackages; } },
888 { "$latexspecialformulachars", [&]() { return latexSpecialFormulaChars; } },
889 { "$formulamacrofile", [&]() { return stripMacroFile; } },
890 { "$latex_batchmode", [&]() { return latex_batchmode(); } }
891 });
892
893 // remove conditional blocks
894 result = selectBlocks(result,
895 {
896 // marker is enabled
897 { "CITATIONS_PRESENT", !CitationManager::instance().isEmpty() },
898 { "COMPACT_LATEX", compactLatex },
899 { "PDF_HYPERLINKS", pdfHyperlinks },
900 { "USE_PDFLATEX", usePdfLatex },
901 { "TIMESTAMP", timeStamp!=TIMESTAMP_t::NO },
902 { "LATEX_FONTENC", !latexFontenc.isEmpty() },
903 { "FORMULA_MACROFILE", !formulaMacrofile.isEmpty() },
904 { "PROJECT_NUMBER", !projectNumber.isEmpty() }
906
907 result = removeEmptyLines(result);
908
909 return result;
910}

References FileInfo::absFilePath, Config_getBool, Config_getEnum, Config_getEnumAsString, Config_getString, convertToLaTeX, copyFile, Date, DateTime, dateToString, extraLatexStyleSheet, FileInfo::fileName, filterLatexString, CitationManager::instance, CitationManager::isEmpty, QCString::isEmpty, latex_batchmode, CitationManager::latexBibFiles, latexMarkerInfo, makeIndex, removeEmptyLines, selectBlocks, QCString::str, TextStream::str, substitute, substituteKeywords, theTranslator, writeExtraLatexPackages and writeLatexSpecialFormulaChars.

Referenced by LatexGenerator::endIndexSection, LatexGenerator::init and LatexGenerator::startIndexSection.

writeDefaultStyleSheet()

void writeDefaultStyleSheet (TextStream & t)
static

Definition at line 683 of file latexgen.cpp.

684{
685 t << ResourceMgr::instance().getAsString("doxygen.sty");
686}

References ResourceMgr::getAsString and ResourceMgr::instance.

writeExtraLatexPackages()

void writeExtraLatexPackages (TextStream & t)

Definition at line 2327 of file latexgen.cpp.

2328{
2329 // User-specified packages
2330 const StringVector &extraPackages = Config_getList(EXTRA_PACKAGES);
2331 if (!extraPackages.empty())
2332 {
2333 t << "% Packages requested by user\n";
2334 for (const auto &pkgName : extraPackages)
2335 {
2336 if ((pkgName[0] == '[') || (pkgName[0] == '{'))
2337 t << "\\usepackage" << pkgName.c_str() << "\n";
2338 else
2339 t << "\\usepackage{" << pkgName.c_str() << "}\n";
2340 }
2341 t << "\n";
2342 }
2343}

Reference Config_getList.

Referenced by FormulaManager::createLatexFile and substituteLatexKeywords.

writeLatexMakefile()

void writeLatexMakefile ()
static

Definition at line 364 of file latexgen.cpp.

364static void writeLatexMakefile()
365{
366 bool generateBib = !CitationManager::instance().isEmpty();
367 QCString fileName=Config_getString(LATEX_OUTPUT)+"/Makefile";
368 std::ofstream f = Portable::openOutputStream(fileName);
369 if (!f.is_open())
370 {
371 term("Could not open file {} for writing\n",fileName);
372 }
373 TextStream t(&f);
374 // inserted by KONNO Akihisa <konno@researchers.jp> 2002-03-05
375 QCString latex_command = theTranslator->latexCommandName().quoted();
376 QCString mkidx_command = Config_getString(MAKEINDEX_CMD_NAME).quoted();
377 QCString bibtex_command = "bibtex";
378 QCString manual_file = "refman";
379 const int latex_count = 8;
380 // end insertion by KONNO Akihisa <konno@researchers.jp> 2002-03-05
381 t << "LATEX_CMD?=" << latex_command << "\n"
382 << "MKIDX_CMD?=" << mkidx_command << "\n"
383 << "BIBTEX_CMD?=" << bibtex_command << "\n"
384 << "LATEX_COUNT?=" << latex_count << "\n"
385 << "MANUAL_FILE?=" << manual_file << "\n"
386 << "\n";
387 if (!Config_getBool(USE_PDFLATEX)) // use plain old latex
388 {
389 t << "all: $(MANUAL_FILE).dvi\n"
390 << "\n"
391 << "ps: $(MANUAL_FILE).ps\n"
392 << "\n"
393 << "pdf: $(MANUAL_FILE).pdf\n"
394 << "\n"
395 << "ps_2on1: $(MANUAL_FILE).ps\n"
396 << "\n"
397 << "pdf_2on1: $(MANUAL_FILE).pdf\n"
398 << "\n"
399 << "$(MANUAL_FILE).ps: $(MANUAL_FILE).dvi\n"
400 << "\tdvips -o $(MANUAL_FILE).ps $(MANUAL_FILE).dvi\n"
401 << "\n";
402 t << "$(MANUAL_FILE).pdf: $(MANUAL_FILE).ps\n";
403 t << "\tps2pdf $(MANUAL_FILE).ps $(MANUAL_FILE).pdf\n\n";
404 t << "$(MANUAL_FILE).dvi: clean $(MANUAL_FILE).tex doxygen.sty\n"
405 << "\techo \"Running latex...\"\n"
406 << "\t$(LATEX_CMD) $(MANUAL_FILE).tex || \\\n"
407 << "\tif [ $$? != 0 ] ; then \\\n"
408 << "\t \\echo \"Please consult $(MANUAL_FILE).log to see the error messages\" ; \\\n"
409 << "\t false; \\\n"
410 << "\tfi\n"
411 << "\techo \"Running makeindex...\"\n"
412 << "\t$(MKIDX_CMD) $(MANUAL_FILE).idx\n";
413 if (generateBib)
414 {
415 t << "\techo \"Running bibtex...\"\n";
416 t << "\t$(BIBTEX_CMD) $(MANUAL_FILE)\n";
417 t << "\techo \"Rerunning latex....\"\n";
418 t << "\t$(LATEX_CMD) $(MANUAL_FILE).tex || \\\n"
419 << "\tif [ $$? != 0 ] ; then \\\n"
420 << "\t \\echo \"Please consult $(MANUAL_FILE).log to see the error messages\" ; \\\n"
421 << "\t false; \\\n"
422 << "\tfi\n";
423 }
424 t << "\techo \"Rerunning latex....\"\n"
425 << "\t$(LATEX_CMD) $(MANUAL_FILE).tex\n"
426 << "\tlatex_count=$(LATEX_COUNT) ; \\\n"
427 << "\twhile grep -E -s 'Rerun (LaTeX|to get cross-references right|to get bibliographical references right)' $(MANUAL_FILE).log && [ $$latex_count -gt 0 ] ;\\\n"
428 << "\t do \\\n"
429 << "\t echo \"Rerunning latex....\" ;\\\n"
430 << "\t $(LATEX_CMD) $(MANUAL_FILE).tex ; \\\n"
431 << "\t $(LATEX_CMD) $(MANUAL_FILE).tex || \\\n"
432 << "\t if [ $$? != 0 ] ; then \\\n"
433 << "\t \\echo \"Please consult $(MANUAL_FILE).log to see the error messages\" ; \\\n"
434 << "\t false; \\\n"
435 << "\t fi; \\\n"
436 << "\t latex_count=`expr $$latex_count - 1` ;\\\n"
437 << "\t done\n"
438 << "\t$(MKIDX_CMD) $(MANUAL_FILE).idx\n"
439 << "\t$(LATEX_CMD) $(MANUAL_FILE).tex || \\\n"
440 << "\tif [ $$? != 0 ] ; then \\\n"
441 << "\t \\echo \"Please consult $(MANUAL_FILE).log to see the error messages\" ; \\\n"
442 << "\t false; \\\n"
443 << "\tfi\n"
444 << "$(MANUAL_FILE).ps: $(MANUAL_FILE).ps\n"
445 << "\tpsnup -2 $(MANUAL_FILE).ps >$(MANUAL_FILE).ps\n"
446 << "\n"
447 << "$(MANUAL_FILE).pdf: $(MANUAL_FILE).ps\n"
448 << "\tps2pdf $(MANUAL_FILE).ps $(MANUAL_FILE).pdf\n";
449 }
450 else // use pdflatex for higher quality output
451 {
452 t << "all: $(MANUAL_FILE).pdf\n\n"
453 << "pdf: $(MANUAL_FILE).pdf\n\n";
454 t << "$(MANUAL_FILE).pdf: clean $(MANUAL_FILE).tex\n";
455 t << "\t$(LATEX_CMD) $(MANUAL_FILE) || \\\n"
456 << "\tif [ $$? != 0 ] ; then \\\n"
457 << "\t \\echo \"Please consult $(MANUAL_FILE).log to see the error messages\" ; \\\n"
458 << "\t false; \\\n"
459 << "\tfi\n";
460 t << "\t$(MKIDX_CMD) $(MANUAL_FILE).idx\n";
461 if (generateBib)
462 {
463 t << "\t$(BIBTEX_CMD) $(MANUAL_FILE)\n";
464 t << "\t$(LATEX_CMD) $(MANUAL_FILE) || \\\n"
465 << "\tif [ $$? != 0 ] ; then \\\n"
466 << "\t \\echo \"Please consult $(MANUAL_FILE).log to see the error messages\" ; \\\n"
467 << "\t false; \\\n"
468 << "\tfi\n";
469 }
470 t << "\t$(LATEX_CMD) $(MANUAL_FILE) || \\\n"
471 << "\tif [ $$? != 0 ] ; then \\\n"
472 << "\t \\echo \"Please consult $(MANUAL_FILE).log to see the error messages\" ; \\\n"
473 << "\t false; \\\n"
474 << "\tfi\n"
475 << "\tlatex_count=$(LATEX_COUNT) ; \\\n"
476 << "\twhile grep -E -s 'Rerun (LaTeX|to get cross-references right|to get bibliographical references right)' $(MANUAL_FILE).log && [ $$latex_count -gt 0 ] ;\\\n"
477 << "\t do \\\n"
478 << "\t echo \"Rerunning latex....\" ;\\\n"
479 << "\t $(LATEX_CMD) $(MANUAL_FILE) || \\\n"
480 << "\t if [ $$? != 0 ] ; then \\\n"
481 << "\t \\echo \"Please consult $(MANUAL_FILE).log to see the error messages\" ; \\\n"
482 << "\t false; \\\n"
483 << "\t fi; \\\n"
484 << "\t latex_count=`expr $$latex_count - 1` ;\\\n"
485 << "\t done\n"
486 << "\t$(MKIDX_CMD) $(MANUAL_FILE).idx\n"
487 << "\t$(LATEX_CMD) $(MANUAL_FILE) || \\\n"
488 << "\tif [ $$? != 0 ] ; then \\\n"
489 << "\t \\echo \"Please consult $(MANUAL_FILE).log to see the error messages\" ; \\\n"
490 << "\t false; \\\n"
491 << "\tfi\n";
492 }
493
494 t << "\n"
495 << "clean:\n"
496 << "\trm -f "
497 << "*.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out *.brf *.blg *.bbl $(MANUAL_FILE).pdf\n";
498}

References Config_getBool, Config_getString, CitationManager::instance, CitationManager::isEmpty, Portable::openOutputStream, QCString::quoted, term and theTranslator.

Referenced by LatexGenerator::init.

writeLatexSpecialFormulaChars()

void writeLatexSpecialFormulaChars (TextStream & t)

Definition at line 2345 of file latexgen.cpp.

2346{
2347 unsigned char minus[4]; // Superscript minus
2348 unsigned char sup2[3]; // Superscript two
2349 unsigned char sup3[3];
2350 minus[0]= 0xE2;
2351 minus[1]= 0x81;
2352 minus[2]= 0xBB;
2353 minus[3]= 0;
2354 sup2[0]= 0xC2;
2355 sup2[1]= 0xB2;
2356 sup2[2]= 0;
2357 sup3[0]= 0xC2;
2358 sup3[1]= 0xB3;
2359 sup3[2]= 0;
2360
2361 t << "\\ifPDFTeX\n";
2362 t << "\\usepackage{newunicodechar}\n";
2363 // taken from the newunicodechar package and removed the warning message
2364 // actually forcing to redefine the unicode character
2365 t << " \\makeatletter\n"
2366 " \\def\\doxynewunicodechar#1#2{%\n"
2367 " \\@tempswafalse\n"
2368 " \\edef\\nuc@tempa{\\detokenize{#1}}%\n"
2369 " \\if\\relax\\nuc@tempa\\relax\n"
2370 " \\nuc@emptyargerr\n"
2371 " \\else\n"
2372 " \\edef\\@tempb{\\expandafter\\@car\\nuc@tempa\\@nil}%\n"
2373 " \\nuc@check\n"
2374 " \\if@tempswa\n"
2375 " \\@namedef{u8:\\nuc@tempa}{#2}%\n"
2376 " \\fi\n"
2377 " \\fi\n"
2378 " }\n"
2379 " \\makeatother\n";
2380
2381 t << " \\doxynewunicodechar{" << minus << "}{${}^{-}$}% Superscript minus\n"
2382 " \\doxynewunicodechar{" << sup2 << "}{${}^{2}$}% Superscript two\n"
2383 " \\doxynewunicodechar{" << sup3 << "}{${}^{3}$}% Superscript three\n"
2384 "\n";
2385 t << "\\fi\n";
2386}

Referenced by FormulaManager::createLatexFile and substituteLatexKeywords.

writeMakeBat()

void writeMakeBat ()
static

Definition at line 500 of file latexgen.cpp.

500static void writeMakeBat()
501{
502#if defined(_MSC_VER)
503 QCString dir=Config_getString(LATEX_OUTPUT);
504 QCString fileName=dir+"/make.bat";
505 QCString latex_command = theTranslator->latexCommandName().quoted();
506 QCString mkidx_command = Config_getString(MAKEINDEX_CMD_NAME).quoted();
507 QCString bibtex_command = "bibtex";
508 QCString manual_file = "refman";
509 const int latex_count = 8;
510 bool generateBib = !CitationManager::instance().isEmpty();
511 std::ofstream t = Portable::openOutputStream(fileName);
512 if (!t.is_open())
513 {
514 term("Could not open file {} for writing\n",fileName);
515 }
516 t << "pushd %~dp0\r\n";
517 t << "if not %errorlevel% == 0 goto :end1\r\n";
518 t << "\r\n";
519 t << "set ORG_LATEX_CMD=%LATEX_CMD%\r\n";
520 t << "set ORG_MKIDX_CMD=%MKIDX_CMD%\r\n";
521 t << "set ORG_BIBTEX_CMD=%BIBTEX_CMD%\r\n";
522 t << "set ORG_LATEX_COUNT=%LATEX_COUNT%\r\n";
523 t << "set ORG_MANUAL_FILE=%MANUAL_FILE%\r\n";
524 t << "if \"X\"%LATEX_CMD% == \"X\" set LATEX_CMD=" << latex_command << "\r\n";
525 t << "if \"X\"%MKIDX_CMD% == \"X\" set MKIDX_CMD=" << mkidx_command << "\r\n";
526 t << "if \"X\"%BIBTEX_CMD% == \"X\" set BIBTEX_CMD=" << bibtex_command << "\r\n";
527 t << "if \"X\"%LATEX_COUNT% == \"X\" set LATEX_COUNT=" << latex_count << "\r\n";
528 t << "if \"X\"%MANUAL_FILE% == \"X\" set MANUAL_FILE=" << manual_file << "\r\n";
529 t << "\r\n";
530 t << "del /s /f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out *.brf *.blg *.bbl %MANUAL_FILE%.pdf\r\n\r\n";
531 t << "\r\n";
532 if (!Config_getBool(USE_PDFLATEX)) // use plain old latex
533 {
534 t << "%LATEX_CMD% %MANUAL_FILE%.tex\r\n";
535 t << "@if ERRORLEVEL 1 goto :error\r\n";
536 t << "echo ----\r\n";
537 t << "%MKIDX_CMD% %MANUAL_FILE%.idx\r\n";
538 if (generateBib)
539 {
540 t << "%BIBTEX_CMD% %MANUAL_FILE%\r\n";
541 t << "echo ----\r\n";
542 t << "\t%LATEX_CMD% %MANUAL_FILE%.tex\r\n";
543 t << "@if ERRORLEVEL 1 goto :error\r\n";
544 }
545 t << "setlocal enabledelayedexpansion\r\n";
546 t << "set count=%LAT#EX_COUNT%\r\n";
547 t << ":repeat\r\n";
548 t << "set content=X\r\n";
549 t << "for /F \"tokens=*\" %%T in ( 'findstr /C:\"Rerun LaTeX\" %MANUAL_FILE%.log' ) do set content=\"%%~T\"\r\n";
550 t << "if !content! == X for /F \"tokens=*\" %%T in ( 'findstr /C:\"Rerun to get cross-references right\" %MANUAL_FILE%.log' ) do set content=\"%%~T\"\r\n";
551 t << "if !content! == X for /F \"tokens=*\" %%T in ( 'findstr /C:\"Rerun to get bibliographical references right\" %MANUAL_FILE%.log' ) do set content=\"%%~T\"\r\n";
552 t << "if !content! == X goto :skip\r\n";
553 t << "set /a count-=1\r\n";
554 t << "if !count! EQU 0 goto :skip\r\n\r\n";
555 t << "echo ----\r\n";
556 t << "%LATEX_CMD% %MANUAL_FILE%.tex\r\n";
557 t << "@if ERRORLEVEL 1 goto :error\r\n";
558 t << "goto :repeat\r\n";
559 t << ":skip\r\n";
560 t << "endlocal\r\n";
561 t << "%MKIDX_CMD% %MANUAL_FILE%.idx\r\n";
562 t << "%LATEX_CMD% %MANUAL_FILE%.tex\r\n";
563 t << "@if ERRORLEVEL 1 goto :error\r\n";
564 t << "dvips -o %MANUAL_FILE%.ps %MANUAL_FILE%.dvi\r\n";
566 t << " -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite "
567 "-sOutputFile=%MANUAL_FILE%.pdf -c save pop -f %MANUAL_FILE%.ps\r\n";
568 }
569 else // use pdflatex
570 {
571 t << "%LATEX_CMD% %MANUAL_FILE%\r\n";
572 t << "@if ERRORLEVEL 1 goto :error\r\n";
573 t << "echo ----\r\n";
574 t << "%MKIDX_CMD% %MANUAL_FILE%.idx\r\n";
575 if (generateBib)
576 {
577 t << "%BIBTEX_CMD% %MANUAL_FILE%\r\n";
578 t << "%LATEX_CMD% %MANUAL_FILE%\r\n";
579 t << "@if ERRORLEVEL 1 goto :error\r\n";
580 }
581 t << "echo ----\r\n";
582 t << "%LATEX_CMD% %MANUAL_FILE%\r\n";
583 t << "@if ERRORLEVEL 1 goto :error\r\n";
584 t << "\r\n";
585 t << "setlocal enabledelayedexpansion\r\n";
586 t << "set count=%LATEX_COUNT%\r\n";
587 t << ":repeat\r\n";
588 t << "set content=X\r\n";
589 t << "for /F \"tokens=*\" %%T in ( 'findstr /C:\"Rerun LaTeX\" %MANUAL_FILE%.log' ) do set content=\"%%~T\"\r\n";
590 t << "if !content! == X for /F \"tokens=*\" %%T in ( 'findstr /C:\"Rerun to get cross-references right\" %MANUAL_FILE%.log' ) do set content=\"%%~T\"\r\n";
591 t << "if !content! == X for /F \"tokens=*\" %%T in ( 'findstr /C:\"Rerun to get bibliographical references right\" %MANUAL_FILE%.log' ) do set content=\"%%~T\"\r\n";
592 t << "if !content! == X goto :skip\r\n";
593 t << "set /a count-=1\r\n";
594 t << "if !count! EQU 0 goto :skip\r\n\r\n";
595 t << "echo ----\r\n";
596 t << "%LATEX_CMD% %MANUAL_FILE%\r\n";
597 t << "@if ERRORLEVEL 1 goto :error\r\n";
598 t << "goto :repeat\r\n";
599 t << ":skip\r\n";
600 t << "endlocal\r\n";
601 t << "%MKIDX_CMD% %MANUAL_FILE%.idx\r\n";
602 t << "%LATEX_CMD% %MANUAL_FILE%\r\n";
603 t << "@if ERRORLEVEL 1 goto :error\r\n";
604 }
605 t<< "\r\n";
606 t << "goto :end\r\n";
607 t << ":error\r\n";
608 t << "@echo ===============\r\n";
609 t << "@echo Please consult %MANUAL_FILE%.log to see the error messages\r\n";
610 t << "@echo ===============\r\n";
611 t<< "\r\n";
612 t<< ":end\r\n";
613 t<< "@REM reset environment\r\n";
614 t<< "popd\r\n";
615 t<< "set LATEX_CMD=%ORG_LATEX_CMD%\r\n";
616 t<< "set ORG_LATEX_CMD=\r\n";
617 t<< "set MKIDX_CMD=%ORG_MKIDX_CMD%\r\n";
618 t<< "set ORG_MKIDX_CMD=\r\n";
619 t<< "set BIBTEX_CMD=%ORG_BIBTEX_CMD%\r\n";
620 t<< "set ORG_BIBTEX_CMD=\r\n";
621 t<< "set MANUAL_FILE=%ORG_MANUAL_FILE%\r\n";
622 t<< "set ORG_MANUAL_FILE=\r\n";
623 t<< "set LATEX_COUNT=%ORG_LATEX_COUNT%\r\n";
624 t<< "set ORG_LATEX_COUNT=\r\n";
625 t<< "\r\n";
626 t<< ":end1\r\n";
627#endif
628}

References Config_getBool, Config_getString, Portable::ghostScriptCommand, CitationManager::instance, CitationManager::isEmpty, Portable::openOutputStream, QCString::quoted, term and theTranslator.

Referenced by LatexGenerator::init.

Variables

g_footer

QCString g_footer
static

Definition at line 53 of file latexgen.cpp.

g_footer_file

QCString g_footer_file
static

Definition at line 54 of file latexgen.cpp.

g_header

QCString g_header
static

Definition at line 51 of file latexgen.cpp.

g_header_file

QCString g_header_file
static

Definition at line 52 of file latexgen.cpp.

latexMarkerInfo

const SelectionMarkerInfo latexMarkerInfo = { '%', "%%BEGIN ",8 ,"%%END ",6, "",0 }
static

Definition at line 55 of file latexgen.cpp.

55static const SelectionMarkerInfo latexMarkerInfo = { '%', "%%BEGIN ",8 ,"%%END ",6, "",0 };

Referenced by LatexGenerator::init and substituteLatexKeywords.

Macro Definitions

COPYCHAR

#define COPYCHAR()   ...
Value
do { \ int bytes = getUTF8CharNumBytes(c); \ if (lresult < (i + bytes + 1)) \ { \ lresult += 512; \ result = static_cast<char *>(realloc(result, lresult)); \ } \ for (int j=0; j<bytes && *p; j++) \ { \ result[i++]=*p++; \ } \ m_col++; \ } while(0)

Definition at line 138 of file latexgen.cpp.

Referenced by LatexCodeGenerator::codify.


Generated via doxygen2docusaurus by Doxygen 1.14.0.