Doxygen
Loading...
Searching...
No Matches
latexgen.h File Reference
#include "config.h"
#include "outputgen.h"
Include dependency graph for latexgen.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

class  LatexCodeGenerator
 Generator for LaTeX code fragments. More...
class  LatexGenerator
 Generator for LaTeX output. More...

Macros

#define LATEX_STYLE_EXTENSION   ".sty"

Functions

void writeExtraLatexPackages (TextStream &t)
void writeLatexSpecialFormulaChars (TextStream &t)
QCString convertToLaTeX (const QCString &s, bool insideTabbing, bool keepSpaces=FALSE)
void filterLatexString (TextStream &t, const QCString &str, bool insideTabbing, bool insidePre, bool insideItem, bool insideTable, bool keepSpaces, const bool retainNewline=false)
QCString latexEscapeLabelName (const QCString &s)
QCString latexEscapeIndexChars (const QCString &s)
QCString latexEscapePDFString (const QCString &s)
QCString latexFilterURL (const QCString &s)
void latexWriteIndexItem (TextStream &t, const QCString &r1, const QCString &s2="")

Macro Definition Documentation

◆ LATEX_STYLE_EXTENSION

#define LATEX_STYLE_EXTENSION   ".sty"

Definition at line 22 of file latexgen.h.

Referenced by copyLatexStyleSheet(), and extraLatexStyleSheet().

Function Documentation

◆ convertToLaTeX()

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

Definition at line 2516 of file latexgen.cpp.

2517{
2518 TextStream t;
2519 filterLatexString(t,s,insideTabbing,false,false,false,keepSpaces);
2520 return t.str();
2521}
Text streaming class that buffers data.
Definition textstream.h:36
std::string str() const
Return the contents of the buffer as a std::string object.
Definition textstream.h:216
void filterLatexString(TextStream &t, const QCString &str, bool insideTabbing, bool insidePre, bool insideItem, bool insideTable, bool keepSpaces, const bool retainNewline)

References filterLatexString(), and TextStream::str().

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

◆ filterLatexString()

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

Definition at line 2346 of file latexgen.cpp.

2348{
2349 if (str.isEmpty()) return;
2350 bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
2351 //printf("filterLatexString(%s) insideTabbing=%d\n",qPrint(str),insideTabbing);
2352 const char *p = str.data();
2353 const char *q = nullptr;
2354 unsigned char pc='\0';
2355
2356 while (*p)
2357 {
2358 unsigned char c=static_cast<unsigned char>(*p++);
2359
2360 if (insidePre)
2361 {
2362 switch(c)
2363 {
2364 case 0xef: // handle U+FFFD i.e. "Replacement character" caused by octal: 357 277 275 / hexadecimal 0xef 0xbf 0xbd
2365 // the LaTeX command \ucr has been defined in doxygen.sty
2366 if (static_cast<unsigned char>(*(p)) == 0xbf && static_cast<unsigned char>(*(p+1)) == 0xbd)
2367 {
2368 t << "{\\ucr}";
2369 p += 2;
2370 }
2371 else
2372 t << static_cast<char>(c);
2373 break;
2374 case '\\': t << "\\(\\backslash\\)"; break;
2375 case '{': t << "\\{"; break;
2376 case '}': t << "\\}"; break;
2377 case '_': t << "\\_"; break;
2378 case '&': t << "\\&"; break;
2379 case '%': t << "\\%"; break;
2380 case '#': t << "\\#"; break;
2381 case '$': t << "\\$"; break;
2382 case '"': t << "\"{}"; break;
2383 case '-': t << "-\\/"; break;
2384 case '^': insideTable ? t << "\\string^" : t << static_cast<char>(c); break;
2385 case '~': t << "\\string~"; break;
2386 case '\n': if (retainNewline) t << "\\newline"; else t << ' ';
2387 break;
2388 case ' ': if (keepSpaces) t << "~"; else t << ' ';
2389 break;
2390 default:
2391 if (c<32) t << ' '; // non printable control character
2392 else t << static_cast<char>(c);
2393 break;
2394 }
2395 }
2396 else
2397 {
2398 switch(c)
2399 {
2400 case 0xef: // handle U+FFFD i.e. "Replacement character" caused by octal: 357 277 275 / hexadecimal 0xef 0xbf 0xbd
2401 // the LaTeX command \ucr has been defined in doxygen.sty
2402 if (static_cast<unsigned char>(*(p)) == 0xbf && static_cast<unsigned char>(*(p+1)) == 0xbd)
2403 {
2404 t << "{\\ucr}";
2405 p += 2;
2406 }
2407 else
2408 t << static_cast<char>(c);
2409 break;
2410 case '#': t << "\\+\\#"; break;
2411 case '$': t << "\\$"; break;
2412 case '%': t << "\\%"; break;
2413 case '^': processEntity(t,pdfHyperlinks,"$^\\wedge$","\\string^"); break;
2414 case '&': {
2415 // possibility to have a special symbol
2416 q = p;
2417 int cnt = 2; // we have to count & and ; as well
2418 while ((*q >= 'a' && *q <= 'z') || (*q >= 'A' && *q <= 'Z') || (*q >= '0' && *q <= '9'))
2419 {
2420 cnt++;
2421 q++;
2422 }
2423 if (*q == ';')
2424 {
2425 --p; // we need & as well
2428 {
2429 p++;
2430 t << "\\&";
2431 }
2432 else
2433 {
2435 q++;
2436 p = q;
2437 }
2438 }
2439 else
2440 {
2441 t << "\\&";
2442 }
2443 }
2444 break;
2445 case '*': processEntity(t,pdfHyperlinks,"$\\ast$","*"); break;
2446 case '_': if (!insideTabbing) t << "\\+";
2447 t << "\\_";
2448 if (!insideTabbing) t << "\\+";
2449 break;
2450 case '{': t << "\\{"; break;
2451 case '}': t << "\\}"; break;
2452 case '<': t << "$<$"; break;
2453 case '>': t << "$>$"; break;
2454 case '|': processEntity(t,pdfHyperlinks,"$\\vert$","|"); break;
2455 case '~': processEntity(t,pdfHyperlinks,"$\\sim$","\\string~"); break;
2456 case '[': if (Config_getBool(PDF_HYPERLINKS) || insideItem)
2457 t << "\\+[";
2458 else
2459 t << "[";
2460 break;
2461 case ']': if (pc=='[') t << "$\\,$";
2462 if (Config_getBool(PDF_HYPERLINKS) || insideItem)
2463 t << "]\\+";
2464 else
2465 t << "]";
2466 break;
2467 case '-': t << "-\\/";
2468 break;
2469 case '\\': t << "\\textbackslash{}";
2470 break;
2471 case '"': t << "\"{}";
2472 break;
2473 case '`': t << "\\`{}";
2474 break;
2475 case '\'': t << "\\textquotesingle{}";
2476 break;
2477 case '\n': if (retainNewline)
2478 {
2479 t << "\\newline";
2480 if (insideTable) t << " ";
2481 }
2482 else
2483 {
2484 t << ' ';
2485 }
2486 break;
2487 case ' ': if (keepSpaces) { if (insideTabbing) t << "\\>"; else t << '~'; } else t << ' ';
2488 break;
2489
2490 default:
2491 //if (!insideTabbing && forceBreaks && c!=' ' && *p!=' ')
2492 if (!insideTabbing &&
2493 ((c>='A' && c<='Z' && pc!=' ' && !(pc>='A' && pc <= 'Z') && pc!='\0' && *p) || (pc=='.' && isId(c)))
2494 )
2495 {
2496 t << "\\+";
2497 }
2498 if (c<32)
2499 {
2500 t << ' '; // non-printable control character
2501 }
2502 else
2503 {
2504 t << static_cast<char>(c);
2505 }
2506 if (!insideTabbing && ((c==':' && *p!=':') || c=='/'))
2507 {
2508 t << "\\+";
2509 }
2510 }
2511 }
2512 pc = c;
2513 }
2514}
const char * latex(SymType symb) const
Access routine to the LaTeX code of the HTML entity.
static HtmlEntityMapper & instance()
Returns the one and only instance of the HTML entity mapper.
SymType name2sym(const QCString &symName) const
Give code of the requested HTML entity name.
This is an alternative implementation of QCString.
Definition qcstring.h:101
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:163
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
Definition qcstring.h:172
#define Config_getBool(name)
Definition config.h:33
bool insideTable(const DocNodeVariant *n)
static void processEntity(TextStream &t, bool pdfHyperlinks, const char *strForm, const char *strRepl)
bool isId(int c)
Definition util.h:208

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().

◆ latexEscapeIndexChars()

QCString latexEscapeIndexChars ( const QCString & s)

Definition at line 2568 of file latexgen.cpp.

2569{
2570 //printf("latexEscapeIndexChars(%s)\n",qPrint(s));
2571 if (s.isEmpty()) return s;
2573 TextStream t;
2574 const char *p=s.data();
2575 char c = 0;
2576 while ((c=*p++))
2577 {
2578 switch (c)
2579 {
2580 case '!': t << "\"!"; break;
2581 case '"': t << "\"\""; break;
2582 case '@': t << "\"@"; break;
2583 case '|': t << "\\texttt{\"|}"; break;
2584 case '[': t << "["; break;
2585 case ']': t << "]"; break;
2586 case '{': t << "\\lcurly{}"; break;
2587 case '}': t << "\\rcurly{}"; break;
2588 // NOTE: adding a case here, means adding it to while below as well!
2589 default:
2590 {
2591 int i=0;
2592 // collect as long string as possible, before handing it to docify
2593 tmp[i++]=c;
2594 while ((c=*p) && c!='"' && c!='@' && c!='[' && c!=']' && c!='!' && c!='{' && c!='}' && c!='|')
2595 {
2596 tmp[i++]=c;
2597 p++;
2598 }
2599 tmp[i]=0;
2600 filterLatexString(t,tmp,
2601 true, // insideTabbing
2602 false, // insidePre
2603 false, // insideItem
2604 false, // insideTable
2605 false // keepSpaces
2606 );
2607 }
2608 break;
2609 }
2610 }
2611 return t.str();
2612}
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition qcstring.h:166
@ ExplicitSize
Definition qcstring.h:146

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

Referenced by latexWriteIndexItem(), and LatexGenerator::startMemberDoc().

◆ latexEscapeLabelName()

QCString latexEscapeLabelName ( const QCString & s)

Definition at line 2523 of file latexgen.cpp.

2524{
2525 //printf("latexEscapeLabelName(%s)\n",qPrint(s));
2526 if (s.isEmpty()) return s;
2528 TextStream t;
2529 const char *p=s.data();
2530 char c = 0;
2531 while ((c=*p++))
2532 {
2533 switch (c)
2534 {
2535 case '|': t << "\\texttt{\"|}"; break;
2536 case '!': t << "\"!"; break;
2537 case '@': t << "\"@"; break;
2538 case '%': t << "\\%"; break;
2539 case '{': t << "\\lcurly{}"; break;
2540 case '}': t << "\\rcurly{}"; break;
2541 case '~': t << "````~"; break; // to get it a bit better in index together with other special characters
2542 // NOTE: adding a case here, means adding it to while below as well!
2543 default:
2544 {
2545 int i=0;
2546 // collect as long string as possible, before handing it to docify
2547 tmp[i++]=c;
2548 while ((c=*p) && c!='@' && c!='[' && c!=']' && c!='!' && c!='{' && c!='}' && c!='|')
2549 {
2550 tmp[i++]=c;
2551 p++;
2552 }
2553 tmp[i]=0;
2554 filterLatexString(t,tmp,
2555 true, // insideTabbing
2556 false, // insidePre
2557 false, // insideItem
2558 false, // insideTable
2559 false // keepSpaces
2560 );
2561 }
2562 break;
2563 }
2564 }
2565 return t.str();
2566}

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

Referenced by latexWriteIndexItem().

◆ latexEscapePDFString()

QCString latexEscapePDFString ( const QCString & s)

Definition at line 2614 of file latexgen.cpp.

2615{
2616 if (s.isEmpty()) return s;
2617 TextStream t;
2618 const char *p=s.data();
2619 char c = 0;
2620 while ((c=*p++))
2621 {
2622 switch (c)
2623 {
2624 case '\\': t << "\\textbackslash{}"; break;
2625 case '{': t << "\\{"; break;
2626 case '}': t << "\\}"; break;
2627 case '_': t << "\\_"; break;
2628 case '%': t << "\\%"; break;
2629 case '&': t << "\\&"; break;
2630 case '#': t << "\\#"; break;
2631 case '$': t << "\\$"; break;
2632 case '^': t << "\\string^"; break;
2633 case '~': t << "\\string~"; break;
2634 default:
2635 t << c;
2636 break;
2637 }
2638 }
2639 return t.str();
2640}

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

Referenced by LatexGenerator::startMemberDoc().

◆ latexFilterURL()

QCString latexFilterURL ( const QCString & s)

Definition at line 2642 of file latexgen.cpp.

2643{
2644 constexpr auto hex = "0123456789ABCDEF";
2645 if (s.isEmpty()) return s;
2646 TextStream t;
2647 const char *p=s.data();
2648 char c = 0;
2649 while ((c=*p++))
2650 {
2651 switch (c)
2652 {
2653 case '#': t << "\\#"; break;
2654 case '%': t << "\\%"; break;
2655 case '\\': t << "\\\\"; break;
2656 case '\n': break; // ignore
2657 default:
2658 if (c<0)
2659 {
2660 unsigned char id = static_cast<unsigned char>(c);
2661 t << "\\%" << hex[id>>4] << hex[id&0xF];
2662 }
2663 else
2664 {
2665 t << c;
2666 }
2667 break;
2668 }
2669 }
2670 return t.str();
2671}
static constexpr auto hex

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

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

◆ latexWriteIndexItem()

void latexWriteIndexItem ( TextStream & t,
const QCString & r1,
const QCString & s2 = "" )

Definition at line 2673 of file latexgen.cpp.

2674{
2675 if (!s1.isEmpty())
2676 {
2677 m_t << "\\index{";
2678 m_t << latexEscapeLabelName(s1);
2679 m_t << "@{";
2680 m_t << latexEscapeIndexChars(s1);
2681 m_t << "}";
2682 if (!s2.isEmpty())
2683 {
2684 m_t << "!";
2685 m_t << latexEscapeLabelName(s2);
2686 m_t << "@{";
2687 m_t << latexEscapeIndexChars(s2);
2688 m_t << "}";
2689 }
2690 m_t << "}\n";
2691 }
2692}
QCString latexEscapeIndexChars(const QCString &s)
QCString latexEscapeLabelName(const QCString &s)

References QCString::isEmpty(), latexEscapeIndexChars(), and latexEscapeLabelName().

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

◆ writeExtraLatexPackages()

void writeExtraLatexPackages ( TextStream & t)

Definition at line 2285 of file latexgen.cpp.

2286{
2287 // User-specified packages
2288 const StringVector &extraPackages = Config_getList(EXTRA_PACKAGES);
2289 if (!extraPackages.empty())
2290 {
2291 t << "% Packages requested by user\n";
2292 for (const auto &pkgName : extraPackages)
2293 {
2294 if ((pkgName[0] == '[') || (pkgName[0] == '{'))
2295 t << "\\usepackage" << pkgName << "\n";
2296 else
2297 t << "\\usepackage{" << pkgName << "}\n";
2298 }
2299 t << "\n";
2300 }
2301}
#define Config_getList(name)
Definition config.h:38
std::vector< std::string > StringVector
Definition containers.h:33

References Config_getList.

Referenced by FormulaManager::createLatexFile(), and substituteLatexKeywords().

◆ writeLatexSpecialFormulaChars()

void writeLatexSpecialFormulaChars ( TextStream & t)

Definition at line 2303 of file latexgen.cpp.

2304{
2305 unsigned char minus[4]; // Superscript minus
2306 unsigned char sup2[3]; // Superscript two
2307 unsigned char sup3[3];
2308 minus[0]= 0xE2;
2309 minus[1]= 0x81;
2310 minus[2]= 0xBB;
2311 minus[3]= 0;
2312 sup2[0]= 0xC2;
2313 sup2[1]= 0xB2;
2314 sup2[2]= 0;
2315 sup3[0]= 0xC2;
2316 sup3[1]= 0xB3;
2317 sup3[2]= 0;
2318
2319 t << "\\ifPDFTeX\n";
2320 t << "\\usepackage{newunicodechar}\n";
2321 // taken from the newunicodechar package and removed the warning message
2322 // actually forcing to redefine the unicode character
2323 t << " \\makeatletter\n"
2324 " \\def\\doxynewunicodechar#1#2{%\n"
2325 " \\@tempswafalse\n"
2326 " \\edef\\nuc@tempa{\\detokenize{#1}}%\n"
2327 " \\if\\relax\\nuc@tempa\\relax\n"
2328 " \\nuc@emptyargerr\n"
2329 " \\else\n"
2330 " \\edef\\@tempb{\\expandafter\\@car\\nuc@tempa\\@nil}%\n"
2331 " \\nuc@check\n"
2332 " \\if@tempswa\n"
2333 " \\@namedef{u8:\\nuc@tempa}{#2}%\n"
2334 " \\fi\n"
2335 " \\fi\n"
2336 " }\n"
2337 " \\makeatother\n";
2338
2339 t << " \\doxynewunicodechar{" << minus << "}{${}^{-}$}% Superscript minus\n"
2340 " \\doxynewunicodechar{" << sup2 << "}{${}^{2}$}% Superscript two\n"
2341 " \\doxynewunicodechar{" << sup3 << "}{${}^{3}$}% Superscript three\n"
2342 "\n";
2343 t << "\\fi\n";
2344}

Referenced by FormulaManager::createLatexFile(), and substituteLatexKeywords().