83 const char *p=str.
data();
108 case '^': *
m_t <<
"\\string^";
112 case '`': *
m_t <<
"\\`{}";
117 int spacesToNextTabStop = tabSize - (
m_col%tabSize);
118 while (spacesToNextTabStop--)
129 case '\n': *
m_t <<
'\n';
139#define COPYCHAR() do { \
140 int bytes = getUTF8CharNumBytes(c); \
141 if (lresult < (i + bytes + 1)) \
144 result = static_cast<char *>(realloc(result, lresult)); \
146 for (int j=0; j<bytes && *p; j++) \
156 c!=0x0c && c!=
'\t' && c!=
'\n' && c!=
' ' && c!=
'^'
206 if (ref.
empty() && usePDFLatex && pdfHyperlinks)
208 *
m_t <<
"\\doxymbox{\\hyperlink{";
211 if (!anchor.
empty()) *
m_t << anchor;
230 *
m_t <<
"\\DoxyCodeLine{";
241 lineAnchor.
sprintf(
"_l%05d",l);
244 bool showTarget = usePDFLatex && pdfHyperlinks && !lineAnchor.
empty() && writeLineAnchor;
247 *
m_t <<
"\\Hypertarget{" <<
stripPath(lineAnchor) <<
"}";
249 if (!fileName.
empty())
276 *
m_t <<
"\\DoxyCodeLine{";
295 *
m_t <<
"\\textcolor{" << name <<
"}{";
317 *
m_t <<
"\\end{" << style <<
"}\n";
375 term(
"Could not open file {} for writing\n",fileName);
381 DString bibtex_command =
"bibtex";
382 DString manual_file =
"refman";
383 const int latex_count = 8;
385 t <<
"LATEX_CMD?=" << latex_command <<
"\n"
386 <<
"MKIDX_CMD?=" << mkidx_command <<
"\n"
387 <<
"BIBTEX_CMD?=" << bibtex_command <<
"\n"
388 <<
"LATEX_COUNT?=" << latex_count <<
"\n"
389 <<
"MANUAL_FILE?=" << manual_file <<
"\n"
393 t <<
"all: $(MANUAL_FILE).dvi\n"
395 <<
"ps: $(MANUAL_FILE).ps\n"
397 <<
"pdf: $(MANUAL_FILE).pdf\n"
399 <<
"ps_2on1: $(MANUAL_FILE).ps\n"
401 <<
"pdf_2on1: $(MANUAL_FILE).pdf\n"
403 <<
"$(MANUAL_FILE).ps: $(MANUAL_FILE).dvi\n"
404 <<
"\tdvips -o $(MANUAL_FILE).ps $(MANUAL_FILE).dvi\n"
406 t <<
"$(MANUAL_FILE).pdf: $(MANUAL_FILE).ps\n";
407 t <<
"\tps2pdf $(MANUAL_FILE).ps $(MANUAL_FILE).pdf\n\n";
408 t <<
"$(MANUAL_FILE).dvi: clean $(MANUAL_FILE).tex doxygen.sty\n"
409 <<
"\techo \"Running latex...\"\n"
410 <<
"\t$(LATEX_CMD) $(MANUAL_FILE).tex || \\\n"
411 <<
"\tif [ $$? != 0 ] ; then \\\n"
412 <<
"\t \\echo \"Please consult $(MANUAL_FILE).log to see the error messages\" ; \\\n"
415 <<
"\techo \"Running makeindex...\"\n"
416 <<
"\t$(MKIDX_CMD) $(MANUAL_FILE).idx\n";
419 t <<
"\techo \"Running bibtex...\"\n";
420 t <<
"\t$(BIBTEX_CMD) $(MANUAL_FILE)\n";
421 t <<
"\techo \"Rerunning latex....\"\n";
422 t <<
"\t$(LATEX_CMD) $(MANUAL_FILE).tex || \\\n"
423 <<
"\tif [ $$? != 0 ] ; then \\\n"
424 <<
"\t \\echo \"Please consult $(MANUAL_FILE).log to see the error messages\" ; \\\n"
428 t <<
"\techo \"Rerunning latex....\"\n"
429 <<
"\t$(LATEX_CMD) $(MANUAL_FILE).tex\n"
430 <<
"\tlatex_count=$(LATEX_COUNT) ; \\\n"
431 <<
"\twhile grep -E -s 'Rerun (LaTeX|to get cross-references right|to get bibliographical references right)' $(MANUAL_FILE).log && [ $$latex_count -gt 0 ] ;\\\n"
433 <<
"\t echo \"Rerunning latex....\" ;\\\n"
434 <<
"\t $(LATEX_CMD) $(MANUAL_FILE).tex ; \\\n"
435 <<
"\t $(LATEX_CMD) $(MANUAL_FILE).tex || \\\n"
436 <<
"\t if [ $$? != 0 ] ; then \\\n"
437 <<
"\t \\echo \"Please consult $(MANUAL_FILE).log to see the error messages\" ; \\\n"
440 <<
"\t latex_count=`expr $$latex_count - 1` ;\\\n"
442 <<
"\t$(MKIDX_CMD) $(MANUAL_FILE).idx\n"
443 <<
"\t$(LATEX_CMD) $(MANUAL_FILE).tex || \\\n"
444 <<
"\tif [ $$? != 0 ] ; then \\\n"
445 <<
"\t \\echo \"Please consult $(MANUAL_FILE).log to see the error messages\" ; \\\n"
448 <<
"$(MANUAL_FILE).ps: $(MANUAL_FILE).ps\n"
449 <<
"\tpsnup -2 $(MANUAL_FILE).ps >$(MANUAL_FILE).ps\n"
451 <<
"$(MANUAL_FILE).pdf: $(MANUAL_FILE).ps\n"
452 <<
"\tps2pdf $(MANUAL_FILE).ps $(MANUAL_FILE).pdf\n";
456 t <<
"all: $(MANUAL_FILE).pdf\n\n"
457 <<
"pdf: $(MANUAL_FILE).pdf\n\n";
458 t <<
"$(MANUAL_FILE).pdf: clean $(MANUAL_FILE).tex\n";
459 t <<
"\t$(LATEX_CMD) $(MANUAL_FILE) || \\\n"
460 <<
"\tif [ $$? != 0 ] ; then \\\n"
461 <<
"\t \\echo \"Please consult $(MANUAL_FILE).log to see the error messages\" ; \\\n"
464 t <<
"\t$(MKIDX_CMD) $(MANUAL_FILE).idx\n";
467 t <<
"\t$(BIBTEX_CMD) $(MANUAL_FILE)\n";
468 t <<
"\t$(LATEX_CMD) $(MANUAL_FILE) || \\\n"
469 <<
"\tif [ $$? != 0 ] ; then \\\n"
470 <<
"\t \\echo \"Please consult $(MANUAL_FILE).log to see the error messages\" ; \\\n"
474 t <<
"\t$(LATEX_CMD) $(MANUAL_FILE) || \\\n"
475 <<
"\tif [ $$? != 0 ] ; then \\\n"
476 <<
"\t \\echo \"Please consult $(MANUAL_FILE).log to see the error messages\" ; \\\n"
479 <<
"\tlatex_count=$(LATEX_COUNT) ; \\\n"
480 <<
"\twhile grep -E -s 'Rerun (LaTeX|to get cross-references right|to get bibliographical references right)' $(MANUAL_FILE).log && [ $$latex_count -gt 0 ] ;\\\n"
482 <<
"\t echo \"Rerunning latex....\" ;\\\n"
483 <<
"\t $(LATEX_CMD) $(MANUAL_FILE) || \\\n"
484 <<
"\t if [ $$? != 0 ] ; then \\\n"
485 <<
"\t \\echo \"Please consult $(MANUAL_FILE).log to see the error messages\" ; \\\n"
488 <<
"\t latex_count=`expr $$latex_count - 1` ;\\\n"
490 <<
"\t$(MKIDX_CMD) $(MANUAL_FILE).idx\n"
491 <<
"\t$(LATEX_CMD) $(MANUAL_FILE) || \\\n"
492 <<
"\tif [ $$? != 0 ] ; then \\\n"
493 <<
"\t \\echo \"Please consult $(MANUAL_FILE).log to see the error messages\" ; \\\n"
501 <<
"*.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out *.brf *.blg *.bbl $(MANUAL_FILE).pdf\n";
508 DString fileName=dir+
"/make.bat";
511 DString bibtex_command =
"bibtex";
512 DString manual_file =
"refman";
513 const int latex_count = 8;
518 term(
"Could not open file {} for writing\n",fileName);
520 t <<
"pushd %~dp0\r\n";
521 t <<
"if not %errorlevel% == 0 goto :end1\r\n";
523 t <<
"set ORG_LATEX_CMD=%LATEX_CMD%\r\n";
524 t <<
"set ORG_MKIDX_CMD=%MKIDX_CMD%\r\n";
525 t <<
"set ORG_BIBTEX_CMD=%BIBTEX_CMD%\r\n";
526 t <<
"set ORG_LATEX_COUNT=%LATEX_COUNT%\r\n";
527 t <<
"set ORG_MANUAL_FILE=%MANUAL_FILE%\r\n";
528 t <<
"if \"X\"%LATEX_CMD% == \"X\" set LATEX_CMD=" << latex_command <<
"\r\n";
529 t <<
"if \"X\"%MKIDX_CMD% == \"X\" set MKIDX_CMD=" << mkidx_command <<
"\r\n";
530 t <<
"if \"X\"%BIBTEX_CMD% == \"X\" set BIBTEX_CMD=" << bibtex_command <<
"\r\n";
531 t <<
"if \"X\"%LATEX_COUNT% == \"X\" set LATEX_COUNT=" << latex_count <<
"\r\n";
532 t <<
"if \"X\"%MANUAL_FILE% == \"X\" set MANUAL_FILE=" << manual_file <<
"\r\n";
534 t <<
"del /s /f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out *.brf *.blg *.bbl %MANUAL_FILE%.pdf\r\n\r\n";
538 t <<
"%LATEX_CMD% %MANUAL_FILE%.tex\r\n";
539 t <<
"@if ERRORLEVEL 1 goto :error\r\n";
540 t <<
"echo ----\r\n";
541 t <<
"%MKIDX_CMD% %MANUAL_FILE%.idx\r\n";
544 t <<
"%BIBTEX_CMD% %MANUAL_FILE%\r\n";
545 t <<
"echo ----\r\n";
546 t <<
"\t%LATEX_CMD% %MANUAL_FILE%.tex\r\n";
547 t <<
"@if ERRORLEVEL 1 goto :error\r\n";
549 t <<
"setlocal enabledelayedexpansion\r\n";
550 t <<
"set count=%LAT#EX_COUNT%\r\n";
552 t <<
"set content=X\r\n";
553 t <<
"for /F \"tokens=*\" %%T in ( 'findstr /C:\"Rerun LaTeX\" %MANUAL_FILE%.log' ) do set content=\"%%~T\"\r\n";
554 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";
555 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";
556 t <<
"if !content! == X goto :skip\r\n";
557 t <<
"set /a count-=1\r\n";
558 t <<
"if !count! EQU 0 goto :skip\r\n\r\n";
559 t <<
"echo ----\r\n";
560 t <<
"%LATEX_CMD% %MANUAL_FILE%.tex\r\n";
561 t <<
"@if ERRORLEVEL 1 goto :error\r\n";
562 t <<
"goto :repeat\r\n";
565 t <<
"%MKIDX_CMD% %MANUAL_FILE%.idx\r\n";
566 t <<
"%LATEX_CMD% %MANUAL_FILE%.tex\r\n";
567 t <<
"@if ERRORLEVEL 1 goto :error\r\n";
568 t <<
"dvips -o %MANUAL_FILE%.ps %MANUAL_FILE%.dvi\r\n";
570 t <<
" -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite "
571 "-sOutputFile=%MANUAL_FILE%.pdf -c save pop -f %MANUAL_FILE%.ps\r\n";
575 t <<
"%LATEX_CMD% %MANUAL_FILE%\r\n";
576 t <<
"@if ERRORLEVEL 1 goto :error\r\n";
577 t <<
"echo ----\r\n";
578 t <<
"%MKIDX_CMD% %MANUAL_FILE%.idx\r\n";
581 t <<
"%BIBTEX_CMD% %MANUAL_FILE%\r\n";
582 t <<
"%LATEX_CMD% %MANUAL_FILE%\r\n";
583 t <<
"@if ERRORLEVEL 1 goto :error\r\n";
585 t <<
"echo ----\r\n";
586 t <<
"%LATEX_CMD% %MANUAL_FILE%\r\n";
587 t <<
"@if ERRORLEVEL 1 goto :error\r\n";
589 t <<
"setlocal enabledelayedexpansion\r\n";
590 t <<
"set count=%LATEX_COUNT%\r\n";
592 t <<
"set content=X\r\n";
593 t <<
"for /F \"tokens=*\" %%T in ( 'findstr /C:\"Rerun LaTeX\" %MANUAL_FILE%.log' ) do set content=\"%%~T\"\r\n";
594 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";
595 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";
596 t <<
"if !content! == X goto :skip\r\n";
597 t <<
"set /a count-=1\r\n";
598 t <<
"if !count! EQU 0 goto :skip\r\n\r\n";
599 t <<
"echo ----\r\n";
600 t <<
"%LATEX_CMD% %MANUAL_FILE%\r\n";
601 t <<
"@if ERRORLEVEL 1 goto :error\r\n";
602 t <<
"goto :repeat\r\n";
605 t <<
"%MKIDX_CMD% %MANUAL_FILE%.idx\r\n";
606 t <<
"%LATEX_CMD% %MANUAL_FILE%\r\n";
607 t <<
"@if ERRORLEVEL 1 goto :error\r\n";
610 t <<
"goto :end\r\n";
612 t <<
"@echo ===============\r\n";
613 t <<
"@echo Please consult %MANUAL_FILE%.log to see the error messages\r\n";
614 t <<
"@echo ===============\r\n";
617 t<<
"@REM reset environment\r\n";
619 t<<
"set LATEX_CMD=%ORG_LATEX_CMD%\r\n";
620 t<<
"set ORG_LATEX_CMD=\r\n";
621 t<<
"set MKIDX_CMD=%ORG_MKIDX_CMD%\r\n";
622 t<<
"set ORG_MKIDX_CMD=\r\n";
623 t<<
"set BIBTEX_CMD=%ORG_BIBTEX_CMD%\r\n";
624 t<<
"set ORG_BIBTEX_CMD=\r\n";
625 t<<
"set MANUAL_FILE=%ORG_MANUAL_FILE%\r\n";
626 t<<
"set ORG_MANUAL_FILE=\r\n";
627 t<<
"set LATEX_COUNT=%ORG_LATEX_COUNT%\r\n";
628 t<<
"set ORG_LATEX_COUNT=\r\n";
640 term(
"Could not create output directory {}\n",dname);
694 t <<
"% Latex header for doxygen " << getDoxygenVersion() <<
"\n";
700 t <<
"% Latex footer for doxygen " << getDoxygenVersion() <<
"\n";
706 t <<
"% stylesheet for doxygen " << getDoxygenVersion() <<
"\n";
737 m_t <<
"\\\\[1ex]\\large ";
744 for (
const auto &fileName : extraLatexStyles)
746 if (!fileName.empty())
751 result +=
"\\usepackage{";
773 if (!latex_mkidx_command.
empty())
775 if (latex_mkidx_command[0] ==
'\\')
776 result += latex_mkidx_command;
778 result +=
"\\"+latex_mkidx_command;
782 result +=
"\\makeindex";
791 case LATEX_BATCHMODE_t::NO:
return "";
792 case LATEX_BATCHMODE_t::YES:
return "\\batchmode";
793 case LATEX_BATCHMODE_t::BATCH:
return "\\batchmode";
794 case LATEX_BATCHMODE_t::NON_STOP:
return "\\nonstopmode";
795 case LATEX_BATCHMODE_t::SCROLL:
return "\\scrollmode";
796 case LATEX_BATCHMODE_t::ERROR_STOP:
return "\\errorstopmode";
821 case TIMESTAMP_t::YES:
822 case TIMESTAMP_t::DATETIME:
826 case TIMESTAMP_t::DATE:
830 case TIMESTAMP_t::NO:
841 generatedBy = tg.
str();
846 if (latexEmojiDirectory.
empty()) latexEmojiDirectory =
".";
847 latexEmojiDirectory =
substitute(latexEmojiDirectory,
"\\",
"/");
859 if (!formulaMacrofile.
empty())
875 {
"$title", [&]() {
return !title.
empty() ? title : projName; } },
876 {
"$doxygenversion", [&]() {
return getDoxygenVersion(); } },
877 {
"$projectname", [&]() {
return projName; } },
878 {
"$projectnumber", [&]() {
return convertToLaTeX(projectNumber,
false); } },
879 {
"$projectbrief", [&]() {
return projBrief; } },
893 {
"$generatedby", [&]() {
return generatedBy; } },
894 {
"$latexbibstyle", [&]() {
return style; } },
897 {
"$papertype", [&]() {
return paperType+
"paper"; } },
900 {
"$latexfontenc", [&]() {
return latexFontenc; } },
902 {
"$latexemojidirectory", [&]() {
return latexEmojiDirectory; } },
903 {
"$makeindex", [&]() {
return makeIndex(); } },
904 {
"$extralatexpackages", [&]() {
return extraLatexPackages; } },
905 {
"$latexspecialformulachars", [&]() {
return latexSpecialFormulaChars; } },
906 {
"$formulamacrofile", [&]() {
return stripMacroFile; } },
915 {
"COMPACT_LATEX", compactLatex },
916 {
"PDF_HYPERLINKS", pdfHyperlinks },
917 {
"USE_PDFLATEX", usePdfLatex },
918 {
"TIMESTAMP", timeStamp!=TIMESTAMP_t::NO },
919 {
"LATEX_FONTENC", !latexFontenc.
empty() },
920 {
"FORMULA_MACROFILE", !formulaMacrofile.
empty() },
921 {
"PROJECT_NUMBER", !projectNumber.
empty() }
942 if (compactLatex)
m_t <<
"\\doxysection";
else m_t <<
"\\chapter";
946 if (compactLatex)
m_t <<
"\\doxysection";
else m_t <<
"\\chapter";
950 if (compactLatex)
m_t <<
"\\doxysection";
else m_t <<
"\\chapter";
954 if (compactLatex)
m_t <<
"\\doxysection";
else m_t <<
"\\chapter";
958 if (compactLatex)
m_t <<
"\\doxysection";
else m_t <<
"\\chapter";
962 if (compactLatex)
m_t <<
"\\doxysection";
else m_t <<
"\\chapter";
966 if (compactLatex)
m_t <<
"\\doxysection";
else m_t <<
"\\chapter";
970 if (compactLatex)
m_t <<
"\\doxysection";
else m_t <<
"\\chapter";
974 if (compactLatex)
m_t <<
"\\doxysection";
else m_t <<
"\\chapter";
981 if (!gd->isReference())
983 if (compactLatex)
m_t <<
"\\doxysection";
else m_t <<
"\\chapter";
994 if (!mod->isReference() && mod->isPrimaryInterface())
996 if (compactLatex)
m_t <<
"\\doxysection";
else m_t <<
"\\chapter";
1007 if (dd->isLinkableInProject())
1009 if (compactLatex)
m_t <<
"\\doxysection";
else m_t <<
"\\chapter";
1020 if (nd->isLinkableInProject() && !nd->isAlias())
1022 if (compactLatex)
m_t <<
"\\doxysection";
else m_t <<
"\\chapter";
1033 if (cd->isLinkableInProject() && !cd->isAlias())
1035 if (compactLatex)
m_t <<
"\\doxysection";
else m_t <<
"\\chapter";
1046 if (cd->isLinkableInProject() &&
1047 !cd->isImplicitTemplateInstance() &&
1048 !cd->isEmbeddedInOuterScope() &&
1052 if (compactLatex)
m_t <<
"\\doxysection";
else m_t <<
"\\chapter";
1064 for (
const auto &fd : *fn)
1066 if (fd->isLinkableInProject() || fd->generateSourceFile())
1070 if (compactLatex)
m_t <<
"\\doxysection";
else m_t <<
"\\chapter";
1082 if (compactLatex)
m_t <<
"\\doxysection";
else m_t <<
"\\chapter";
1112 m_t <<
"}\n\\input{modules}\n";
1115 m_t <<
"}\n\\input{topics}\n";
1118 m_t <<
"}\n\\input{dirs}\n";
1121 m_t <<
"}\n\\input{namespaces}\n";
1124 m_t <<
"}\n\\input{concepts}\n";
1127 m_t <<
"}\n\\input{hierarchy}\n";
1130 m_t <<
"}\n\\input{annotated}\n";
1133 m_t <<
"}\n\\input{files}\n";
1136 m_t <<
"}\n\\input{pages}\n";
1143 if (!gd->isReference() && !gd->isASubGroup())
1155 if (!mod->isReference() && mod->isPrimaryInterface())
1167 if (dd->isLinkableInProject())
1174 m_t <<
"\\input{" << dd->getOutputFileBase() <<
"}\n";
1184 if (nd->isLinkableInProject() && !nd->isAlias())
1191 m_t <<
"\\input{" << nd->getOutputFileBase() <<
"}\n";
1201 if (cd->isLinkableInProject() && !cd->isAlias())
1208 m_t <<
"\\input{" << cd->getOutputFileBase() <<
"}\n";
1218 if (cd->isLinkableInProject() &&
1219 !cd->isImplicitTemplateInstance() &&
1220 !cd->isEmbeddedInOuterScope() &&
1229 m_t <<
"\\input{" << cd->getOutputFileBase() <<
"}\n";
1239 for (
const auto &fd : *fn)
1241 if (fd->isLinkableInProject())
1248 m_t <<
"\\input{" << fd->getOutputFileBase() <<
"}\n";
1250 if (fd->generateSourceFile())
1257 m_t <<
"\\input{" << fd->getSourceFileBase() <<
"}\n";
1268 m_t <<
"\\input{" << pd->getOutputFileBase() <<
"}\n";
1276 if (!pd->getGroupDef() && !pd->isReference() && !pd->hasParentPage()
1298 m_t <<
"{" << name <<
"}\n";
1320 m_t <<
"\n" <<
"\n";
1325 m_t <<
"\n" <<
"\n";
1338 m_t <<
"\\contentsline{section}{";
1353 m_t <<
"\\item\\contentsline{section}\\textbf{ ";
1361 m_t <<
"\\item\\contentsline{section}{";
1371 if (hasBrief)
m_t <<
"\\\\*";
1393 m_t <<
"\\doxymbox{\\hyperlink{";
1395 if (!anchor.
empty())
m_t <<
"_" << anchor;
1400 m_t <<
"\\textbf{ ";
1416 bool insideTabbing,
bool disableLinks)
1420 if (!disableLinks && ref.
empty() && pdfHyperlinks)
1422 result +=
"\\doxymbox{\\hyperlink{";
1424 if (!f.
empty() && !anchor.
empty()) result +=
"_";
1425 if (!anchor.
empty()) result += anchor;
1432 result +=
"\\textbf{ ";
1443 t <<
"\\texorpdfstring{";
1448 t <<
"}{" << strRepl <<
"}";
1460 m_t <<
" \\doxyref{}{";
1466 if (!clname.
empty())
m_t << clname;
1467 if (!anchor.
empty())
m_t <<
"_" << anchor;
1480 if (hierarchyLevel < 0)
1481 m_t <<
"\\chapter{";
1500 m_t <<
"\\label{" << fn <<
"}";
1515 if (extraIndentLevel>=3)
1517 m_t <<
"\\doxysubparagraph*{";
1519 else if (extraIndentLevel==2)
1521 m_t <<
"\\doxyparagraph{";
1563 if (!memname.
empty() && memname[0]!=
'@')
1572 m_t <<
"\\doxysubparagraph";
1574 else if (compactLatex)
1576 m_t <<
"\\doxyparagraph";
1586 m_t <<
"\\texorpdfstring{";
1595 m_t <<
"\\hspace{0.1cm}{\\footnotesize\\ttfamily [" << memCount <<
"/" << memTotal <<
"]}";
1598 m_t <<
"\n{\\footnotesize\\ttfamily ";
1616 if (usePDFLatex && pdfHyperlinks)
1618 m_t <<
"\\Hypertarget{";
1620 if (!anchor.
empty())
m_t <<
"_" << anchor;
1633 if (!anchor.
empty())
m_t <<
"_" << anchor;
1651 if (usePDFLatex && pdfHyperlinks)
1683 if (usePDFLatex && pdfHyperlinks)
1699 default:
ASSERT(0);
break;
1714 default:
ASSERT(0);
break;
1722 m_t <<
"}\\label{" << lab <<
"}\n";
1762 m_t <<
"\\begin{tabbing}\n";
1763 m_t <<
"xx\\=xx\\=xx\\=xx\\=xx\\=xx\\=xx\\=xx\\=xx\\=\\kill\n";
1773 m_t <<
"\n" <<
"\\end{tabbing}";
1783 m_t <<
"{\\footnotesize ";
1819 m_t <<
"\\begin{DoxyCompactList}\\small\\item\\em ";
1833 m_t <<
"\\end{DoxyCompactList}";
1872 m_t <<
"\\begin{DoxyEnumFields}[" << (hasInits?3:2) <<
"]{" << title <<
"}\n";
1878 m_t <<
"\\end{DoxyEnumFields}\n";
1885 m_t <<
"\\raisebox{\\heightof{T}}[0pt][0pt]{";
1917 m_t <<
"\\\\\n\\hline\n\n";
1929 m_t <<
"\\begin{DoxyCompactItemize}\n";
1938 m_t <<
"\\end{DoxyCompactItemize}\n";
1947 m_t <<
"\\begin{Indent}";
1948 m_t <<
"\\textbf{ ";
1964 if (hasHeader)
m_t <<
"}\\par\n";
1984 if (hasHeader)
m_t <<
"\\end{Indent}";
1990 m_t <<
"\n" <<
"\n";
2036 m_t <<
"\\begin{Desc}\n\\item[";
2043 m_t <<
"\\end{Desc}\n";
2049 if (openBracket)
m_t <<
"(";
2050 m_t <<
"\\begin{DoxyParamCaption}";
2088 m_t <<
"\\end{DoxyParamCaption}";
2089 if (closeBracket)
m_t <<
")";
2099 else if (closeBracket)
2114 std::visit(visitor,astImpl->
root);
2120 m_t <<
"\\begin{Desc}\n\\item[";
2123 m_t <<
"\\begin{description}\n";
2128 m_t <<
"\\item[{\\em ";
2137 m_t <<
"} : {\\em ";
2155 m_t <<
"\\end{description}\n";
2156 m_t <<
"\\end{Desc}\n";
2163 m_t <<
"\\doxyparagraph*{";
2184 m_t <<
"\\newline\n";
2193 m_t <<
"\\begin{DoxyEnumFields}{";
2198 m_t <<
"\\begin{DoxyFields}{";
2211 m_t <<
"\\end{DoxyEnumFields}\n";
2215 m_t <<
"\\end{DoxyFields}\n";
2247 m_t <<
"\\\\\n\\hline\n\n";
2252 m_t <<
"\\hspace{0.3cm}";
2257 m_t <<
"{\\ttfamily [" << l <<
"]}";
2258 if (!isLast)
m_t <<
", ";
2272 m_t <<
"\\doxyparagraph*{";
2286 m_t <<
"\\etocsetnexttocdepth{" << maxLevel <<
"}\n";
2287 m_t <<
"\\localtableofcontents\n";
2292 m_t <<
"\\begin{DoxyEmbeddedDoc}[" << indent <<
"]\n";
2297 m_t <<
"\\end{DoxyEmbeddedDoc}\n";
2306 if (!extraPackages.empty())
2308 t <<
"% Packages requested by user\n";
2309 for (
const auto &pkgName : extraPackages)
2311 if ((pkgName[0] ==
'[') || (pkgName[0] ==
'{'))
2312 t <<
"\\usepackage" << pkgName <<
"\n";
2314 t <<
"\\usepackage{" << pkgName <<
"}\n";
2322 unsigned char minus[4];
2323 unsigned char sup2[3];
2324 unsigned char sup3[3];
2336 t <<
"\\ifPDFTeX\n";
2337 t <<
"\\usepackage{newunicodechar}\n";
2340 t <<
" \\makeatletter\n"
2341 " \\def\\doxynewunicodechar#1#2{%\n"
2342 " \\@tempswafalse\n"
2343 " \\edef\\nuc@tempa{\\detokenize{#1}}%\n"
2344 " \\if\\relax\\nuc@tempa\\relax\n"
2345 " \\nuc@emptyargerr\n"
2347 " \\edef\\@tempb{\\expandafter\\@car\\nuc@tempa\\@nil}%\n"
2350 " \\@namedef{u8:\\nuc@tempa}{#2}%\n"
2356 t <<
" \\doxynewunicodechar{" << minus <<
"}{${}^{-}$}% Superscript minus\n"
2357 " \\doxynewunicodechar{" << sup2 <<
"}{${}^{2}$}% Superscript two\n"
2358 " \\doxynewunicodechar{" << sup3 <<
"}{${}^{3}$}% Superscript three\n"
2364 bool insideTabbing,
bool insidePre,
bool insideItem,
bool insideTable,
bool keepSpaces,
const bool retainNewline)
2366 if (str.
empty())
return;
2369 const char *p = str.
data();
2370 unsigned char pc=
'\0';
2374 unsigned char c=
static_cast<unsigned char>(*p++);
2382 if (
static_cast<unsigned char>(*(p)) == 0xbf &&
static_cast<unsigned char>(*(p+1)) == 0xbd)
2388 t << static_cast<char>(c);
2390 case '\\': t <<
"\\(\\backslash\\)";
break;
2391 case '{': t <<
"\\{";
break;
2392 case '}': t <<
"\\}";
break;
2393 case '_': t <<
"\\_";
break;
2394 case '&': t <<
"\\&";
break;
2395 case '%': t <<
"\\%";
break;
2396 case '#': t <<
"\\#";
break;
2397 case '$': t <<
"\\$";
break;
2398 case '"': t <<
"\"{}";
break;
2399 case '-': t <<
"-\\/";
break;
2400 case '^':
insideTable ? t <<
"\\string^" : t << static_cast<char>(c);
break;
2401 case '~': t <<
"\\string~";
break;
2402 case '\n':
if (retainNewline) t <<
"\\newline";
else t <<
' ';
2404 case ' ':
if (keepSpaces) t <<
"~";
else t <<
' ';
2408 else t << static_cast<char>(c);
2418 if (
static_cast<unsigned char>(*(p)) == 0xbf &&
static_cast<unsigned char>(*(p+1)) == 0xbd)
2424 t << static_cast<char>(c);
2426 case '#': t <<
"\\+\\#";
break;
2427 case '$': t <<
"\\$";
break;
2428 case '%': t <<
"\\%";
break;
2429 case '^':
processEntity(t,pdfHyperlinks,
"$^\\wedge$",
"\\string^");
break;
2439 case '*':
processEntity(t,pdfHyperlinks,
"$\\ast$",
"*");
break;
2440 case '_':
if (!insideTabbing && *p) t <<
"\\+";
2442 if (!insideTabbing && *p) t <<
"\\+";
2444 case '{': t <<
"\\{";
break;
2445 case '}': t <<
"\\}";
break;
2446 case '<': t <<
"$<$";
break;
2447 case '>': t <<
"$>$";
break;
2448 case '|':
processEntity(t,pdfHyperlinks,
"$\\vert$",
"|");
break;
2449 case '~':
processEntity(t,pdfHyperlinks,
"$\\sim$",
"\\string~");
break;
2455 case ']':
if (pc==
'[') t <<
"$\\,$";
2461 case '-': t <<
"-\\/";
2463 case '\\': t <<
"\\textbackslash{}";
2465 case '"': t <<
"\"{}";
2467 case '`': t <<
"\\`{}";
2469 case '\'': t <<
"\\textquotesingle{}";
2471 case '\n':
if (retainNewline)
2481 case ' ':
if (keepSpaces) {
if (insideTabbing) t <<
"\\>";
else t <<
'~'; }
else t <<
' ';
2486 if (!insideTabbing &&
2487 ((c>=
'A' && c<=
'Z' && pc!=
' ' && !(pc>=
'A' && pc <=
'Z') && pc!=
'\0' && *p) || (pc==
'.' &&
isId(c)))
2498 t << static_cast<char>(c);
2500 if (!insideTabbing && *p && ((c==
':' && *p!=
':') || c==
'/'))
2520 if (s.
empty())
return s;
2523 const char *p=s.
data();
2529 case '|': t <<
"\\texttt{\"|}";
break;
2530 case '!': t <<
"\"!";
break;
2531 case '@': t <<
"\"@";
break;
2532 case '%': t <<
"\\%";
break;
2533 case '{': t <<
"\\lcurly{}";
break;
2534 case '}': t <<
"\\rcurly{}";
break;
2535 case '~': t <<
"````~";
break;
2542 while ((c=*p) && c!=
'@' && c!=
'[' && c!=
']' && c!=
'!' && c!=
'{' && c!=
'}' && c!=
'|')
2565 if (s.
empty())
return s;
2568 const char *p=s.
data();
2574 case '!': t <<
"\"!";
break;
2575 case '"': t <<
"\"\"";
break;
2576 case '@': t <<
"\"@";
break;
2577 case '|': t <<
"\\texttt{\"|}";
break;
2578 case '[': t <<
"[";
break;
2579 case ']': t <<
"]";
break;
2580 case '{': t <<
"\\lcurly{}";
break;
2581 case '}': t <<
"\\rcurly{}";
break;
2588 while ((c=*p) && c!=
'"' && c!=
'@' && c!=
'[' && c!=
']' && c!=
'!' && c!=
'{' && c!=
'}' && c!=
'|')
2610 if (s.
empty())
return s;
2612 const char *p=s.
data();
2618 case '\\': t <<
"\\textbackslash{}";
break;
2619 case '{': t <<
"\\{";
break;
2620 case '}': t <<
"\\}";
break;
2621 case '_': t <<
"\\_";
break;
2622 case '%': t <<
"\\%";
break;
2623 case '&': t <<
"\\&";
break;
2624 case '#': t <<
"\\#";
break;
2625 case '$': t <<
"\\$";
break;
2626 case '^': t <<
"\\string^";
break;
2627 case '~': t <<
"\\string~";
break;
2638 constexpr auto hex =
"0123456789ABCDEF";
2639 if (s.
empty())
return s;
2641 const char *p=s.
data();
2647 case '#': t <<
"\\#";
break;
2648 case '%': t <<
"\\%";
break;
2649 case '\\': t <<
"\\\\";
break;
2654 unsigned char id =
static_cast<unsigned char>(c);
2655 t <<
"\\%" << hex[
id>>4] << hex[
id&0xF];
static CitationManager & instance()
bool empty() const
return true if there are no citations.
DString latexBibFiles()
lists the bibtex cite files in a comma separated list
Class representing a built-in class diagram.
void writeFigure(TextStream &t, const DString &path, const DString &file) const
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
DString repeat(unsigned int n) const
DString & prepend(const char *s)
DString & sprintf(const char *format,...)
const std::string & str() const
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
bool endsWith(const char *s) const
size_t length() const
Returns the length of the string, not counting the 0-terminator.
The common base class of all entity definitions found in the sources.
virtual DString getDefFileExtension() const =0
Class representing a directory in the file system.
bool mkdir(const std::string &path, bool acceptsAbsPath=true) const
Class representing the abstract syntax tree of a documentation block.
Representation of an call graph.
DString writeGraph(TextStream &t, GraphOutputFormat gf, EmbeddedOutputFormat ef, const DString &path, const DString &fileName, const DString &relPath, bool writeImageMap=true, int graphId=-1)
Representation of a class inheritance or dependency graph.
DString writeGraph(TextStream &t, GraphOutputFormat gf, EmbeddedOutputFormat ef, const DString &path, const DString &fileName, const DString &relPath, bool TBRank=true, bool imageMap=true, int graphId=-1)
Representation of an directory dependency graph.
DString writeGraph(TextStream &out, GraphOutputFormat gf, EmbeddedOutputFormat ef, const DString &path, const DString &fileName, const DString &relPath, bool writeImageMap=true, int graphId=-1, bool linkRelations=true)
Representation of a group collaboration graph.
DString writeGraph(TextStream &t, GraphOutputFormat gf, EmbeddedOutputFormat ef, const DString &path, const DString &fileName, const DString &relPath, bool writeImageMap=true, int graphId=-1)
Representation of an include dependency graph.
DString writeGraph(TextStream &t, GraphOutputFormat gf, EmbeddedOutputFormat ef, const DString &path, const DString &fileName, const DString &relPath, bool writeImageMap=true, int graphId=-1)
static NamespaceLinkedMap * namespaceLinkedMap
static ConceptLinkedMap * conceptLinkedMap
static std::unique_ptr< PageDef > mainPage
static FileNameLinkedMap * inputNameLinkedMap
static ClassLinkedMap * classLinkedMap
static PageLinkedMap * exampleLinkedMap
static PageLinkedMap * pageLinkedMap
static DirLinkedMap * dirLinkedMap
static GroupLinkedMap * groupLinkedMap
Minimal replacement for QFileInfo.
std::string fileName() const
std::string absFilePath() const
const char * latex(SymType symb) const
Access routine to the LaTeX code of the HTML entity.
const char * writeHtmlEntity(T &result, const char *s, HtmlEntityMapperFunc &&mapper, const char *fallback)
static HtmlEntityMapper & instance()
Returns the one and only instance of the HTML entity mapper.
opaque representation of the abstract syntax tree (AST)
Generator for LaTeX code fragments.
int usedTableLevel() const
void startCodeFragment(const DString &style) override
LatexCodeGenerator(TextStream *t, const DString &relPath, const DString &sourceFile)
void setStripIndentAmount(size_t amount) override
void setInsideTabbing(bool b)
void endFontClass() override
bool insideTabbing() const
void codify(const DString &text) override
void writeCodeLink(CodeSymbolType type, const DString &ref, const DString &file, const DString &anchor, const DString &name, const DString &tooltip) override
void setTextStream(TextStream *t)
void endSpecialComment() override
void stripCodeComments(bool b) override
size_t m_stripIndentAmount
void startCodeLine(int) override
void startSpecialComment() override
void startFontClass(const DString &) override
void writeLineNumber(const DString &, const DString &, const DString &, int, bool) override
void setRelativePath(const DString &path)
void endCodeFragment(const DString &style) override
void endCodeLine() override
void setSourceFileName(const DString &sourceFileName)
Concrete visitor implementation for LaTeX output.
void endMemberItem(MemberItemType) override
void addCodeGen(OutputCodeList &list) override
void endIndexKey() override
void endInlineMemberDoc() override
void startMemberHeader(const DString &, int) override
void startProjectNumber() override
void startIndexSection(IndexSection) override
void writeInheritedSectionTitle(const DString &, const DString &, const DString &, const DString &, const DString &, const DString &) override
void endParameterList() override
void endMemberDescription() override
std::unique_ptr< OutputCodeList > m_codeList
void endDirDepGraph(DotDirDeps &g) override
void endDescTable() override
void startMemberGroup() override
void endInlineHeader() override
void endGroupHeader(int) override
void writeAnchor(const DString &fileName, const DString &name) override
void startTextLink(const DString &, const DString &) override
void writeChar(char c) override
void endDescTableInit() override
void docify(const DString &text) override
void startParameterName(bool) override
void writePageLink(const DString &, bool) override
void endParameterType() override
void startPageRef() override
void startFile(const DString &name, bool isSource, const DString &manName, const DString &title, int id, int hierarchyLevel) override
void endLabels() override
void endIndexValue(const DString &, bool) override
void endSection(const DString &, SectionType) override
void endIndexSection(IndexSection) override
void startMemberDoc(const DString &, const DString &, const DString &, const DString &, int, int, bool) override
void exceptionEntry(const DString &, bool) override
void startConstraintType() override
void startClassDiagram() override
void endInlineMemberType() override
void startDescTableTitle() override
void endInclDepGraph(DotInclDepGraph &) override
void writeNonBreakableSpace(int) override
void startTitleHead(const DString &) override
void startMemberGroupDocs() override
void startDescTable(const DString &title, const bool hasInits) override
void endDescTableTitle() override
void startMemberDescription(const DString &, const DString &, bool) override
void startInclDepGraph() override
void lastIndexPage() override
void endExamples() override
void startLocalToc(int level) override
void startAnonTypeScope(int) override
void endPlainFile() override
void endTitleHead(const DString &, const DString &name) override
static void writeFooterFile(TextStream &t)
void startParameterList(bool) override
void endMemberDoc(bool) override
void endConstraintType() override
void startDescTableRow() override
void endAnonTypeScope(int) override
void endConstraintList() override
void startDotGraph() override
void endParameterExtra(bool last, bool one, bool bracket) override
void startSection(const DString &, const DString &, SectionType) override
void startConstraintList(const DString &) override
void endDescTableData() override
void endIndexItem(const DString &ref, const DString &file) override
void startGroupCollaboration() override
void startLabels() override
void endMemberGroupHeader(bool) override
static void writeStyleSheetFile(TextStream &t)
void endMemberHeader() override
OutputType type() const override
void lineBreak(const DString &style=DString()) override
void endConstraintDocs() override
void startIndexKey() override
void startMemberGroupHeader(const DString &, bool) override
void startConstraintParam() override
void endInlineMemberName() override
void startMemberTemplateParams() override
void startInlineMemberType() override
void writeStartAnnoItem(const DString &type, const DString &file, const DString &path, const DString &name) override
void startPlainFile(const DString &name) override
void startInlineMemberDoc() override
void addLabel(const DString &, const DString &) override
void startCallGraph() override
void endMemberList() override
void startExamples() override
void startIndexItem(const DString &ref, const DString &file) override
LatexGenerator & operator=(const LatexGenerator &)
void startDirDepGraph() override
void endTextLink() override
void endEmbeddedDoc() override
void startMemberList() override
void startDescTableData() override
void endDescTableRow() override
void startConstraintDocs() override
void endMemberGroupDocs() override
void endMemberTemplateParams(const DString &, const DString &) override
void startDescTableInit() override
void addIndexItem(const DString &, const DString &) override
void endMemberDocSimple(bool) override
void endParameterName() override
void startGroupHeader(const DString &, int) override
void startMemberDocSimple(bool) override
void endCallGraph(DotCallGraph &) override
void endGroupCollaboration(DotGroupCollaboration &g) override
void startParagraph(const DString &classDef) override
void startInlineHeader() override
void endConstraintParam() override
void endDotGraph(DotClassGraph &) override
void writeString(const DString &text) override
void startParameterExtra() override
LatexCodeGenerator * m_codeGen
void endMemberGroup(bool) override
static void writeHeaderFile(TextStream &t)
void startEmbeddedDoc(size_t) override
void endParagraph() override
void writeObjectLink(const DString &ref, const DString &file, const DString &anchor, const DString &name) override
void endClassDiagram(const ClassDiagram &, const DString &, const DString &) override
void writeStyleInfo(int part) override
void endDoxyAnchor(const DString &, const DString &) override
void startIndexValue(bool) override
void writeLabel(const DString &l, bool isLast) override
void startInlineMemberName() override
void startDoxyAnchor(const DString &, const DString &, const DString &, const DString &, const DString &) override
void writeDoc(const IDocNodeAST *node, const Definition *ctx, const MemberDef *, int id, int sectionLevel) override
void startMemberItem(const DString &, MemberItemType, const DString &) override
void startParameterType(bool, const DString &) override
void endPageRef(const DString &, const DString &) override
bool m_templateMemberItem
A model of a class/file/namespace member symbol.
static ModuleManager & instance()
Class representing a list of different code generators.
void add(OutputCodeIntfPtr &&p)
Abstract interface for output generators.
static ResourceMgr & instance()
Returns the one and only instance of this class.
DString getAsString(const DString &name) const
Gets the resource data as a C string.
static constexpr int Section
static constexpr int Subsection
static constexpr int Subsubsection
constexpr int level() const
static constexpr int Page
static constexpr int Paragraph
static constexpr int Subsubparagraph
static constexpr int Subparagraph
Text streaming class that buffers data.
std::string str() const
Return the contents of the buffer as a std::string object.
virtual DString trCompoundMembers()=0
virtual DString latexDocumentPost()
virtual DString trGeneratedAt(const DString &date, const DString &projName)=0
virtual DString latexFontenc()
virtual DString trInheritedFrom(const DString &members, const DString &what)=0
virtual DString trCiteReferences()=0
virtual DString latexLanguageSupportCommand()=0
virtual DString trISOLang()=0
virtual DString latexFont()
virtual DString latexDocumentPre()
virtual DString trGeneratedBy()=0
virtual DString trEnumerationValues()=0
virtual DString latexCommandName()
virtual DString trExamples()=0
#define Config_getInt(name)
#define Config_getList(name)
#define Config_getEnumAsString(name)
#define Config_getBool(name)
#define Config_getString(name)
#define Config_getEnum(name)
std::vector< std::string > StringVector
DString yearToString()
Returns the current year as a string.
DString dateToString(DateTimeType includeTime)
Returns the current date, when includeTime is set also the time is provided.
bool insideTable(const DocNodeVariant *n)
DString substitute(const DString &s, const DString &src, const DString &dst)
substitute all occurrences of src in s by dst
bool isId(int c)
Returns true if c is a valid character for an identifier.
@ isNamespaceDocumentation
Translator * theTranslator
static DString extraLatexStyleSheet()
static DString substituteLatexKeywords(const DString &file, const DString &str, const DString &title)
static void writeLatexMakefile()
static DString latex_batchmode()
DString latexFilterURL(const DString &s)
DString latexEscapePDFString(const DString &s)
static const SelectionMarkerInfo latexMarkerInfo
DString latexEscapeIndexChars(const DString &s)
DString latexEscapeLabelName(const DString &s)
static void processEntity(TextStream &t, bool pdfHyperlinks, const char *strForm, const char *strRepl)
static void writeMakeBat()
static void writeDefaultStyleSheet(TextStream &t)
void filterLatexString(TextStream &t, const DString &str, bool insideTabbing, bool insidePre, bool insideItem, bool insideTable, bool keepSpaces, const bool retainNewline)
void writeExtraLatexPackages(TextStream &t)
static DString g_header_file
static DString makeIndex()
void latexWriteIndexItem(TextStream &m_t, const DString &s1, const DString &s2)
static DString objectLinkToString(const DString &ref, const DString &f, const DString &anchor, const DString &text, bool insideTabbing, bool disableLinks)
void writeLatexSpecialFormulaChars(TextStream &t)
static DString g_footer_file
DString convertToLaTeX(const DString &s, bool insideTabbing, bool keepSpaces)
void latexWriteIndexItem(TextStream &t, const DString &r1, const DString &s2="")
#define LATEX_STYLE_EXTENSION
DString latexEscapePDFString(const DString &s)
DString latexEscapeIndexChars(const DString &s)
DString convertToLaTeX(const DString &s, bool insideTabbing, bool keepSpaces=false)
void filterLatexString(TextStream &t, const DString &str, bool insideTabbing, bool insidePre, bool insideItem, bool insideTable, bool keepSpaces, const bool retainNewline=false)
const char * ghostScriptCommand()
std::ofstream openOutputStream(const DString &name, bool append=false)
size_t updateColumnCount(const char *s, size_t col)
OutputCodeDefer< LatexCodeGenerator > LatexCodeGeneratorDefer
Portable versions of functions that are platform dependent.
Some helper functions for std::string.
std::string removeEmptyLines(const std::string &s)
Various UTF8 related helper functions.
DString selectBlocks(const DString &s, const SelectionBlockList &blockList, const SelectionMarkerInfo &markerInfo)
remove disabled blocks and all block markers from s and return the result as a string
bool checkExtension(const DString &fName, const DString &ext)
DString showDate(const DString &fmt)
DString stripExtensionGeneral(const DString &fName, const DString &ext)
void clearSubDirs(const Dir &d)
void createSubDirs(const Dir &d)
void checkBlocks(const DString &s, const DString fileName, const SelectionMarkerInfo &markerInfo)
DString fileToString(const DString &name, bool filter, bool isSourceCode)
DString substituteKeywords(const DString &file, const DString &s, const KeywordSubstitutionList &keywords)
DString relativePathToRoot(const DString &name)
DString projectLogoFile()
bool copyFile(const DString &src, const DString &dest)
Copies the contents of file with name src to the newly created file with name dest.
DString projectLogoSize()
DString stripPath(const DString &s)
A bunch of utility functions.