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 2517 of file latexgen.cpp.

2518{
2519 TextStream t;
2520 filterLatexString(t,s,insideTabbing,false,false,false,keepSpaces);
2521 return t.str();
2522}
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 2347 of file latexgen.cpp.

2349{
2350 if (str.isEmpty()) return;
2351 bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
2352 //printf("filterLatexString(%s) insideTabbing=%d\n",qPrint(str),insideTabbing);
2353 const char *p = str.data();
2354 const char *q = nullptr;
2355 unsigned char pc='\0';
2356
2357 while (*p)
2358 {
2359 unsigned char c=static_cast<unsigned char>(*p++);
2360
2361 if (insidePre)
2362 {
2363 switch(c)
2364 {
2365 case 0xef: // handle U+FFFD i.e. "Replacement character" caused by octal: 357 277 275 / hexadecimal 0xef 0xbf 0xbd
2366 // the LaTeX command \ucr has been defined in doxygen.sty
2367 if (static_cast<unsigned char>(*(p)) == 0xbf && static_cast<unsigned char>(*(p+1)) == 0xbd)
2368 {
2369 t << "{\\ucr}";
2370 p += 2;
2371 }
2372 else
2373 t << static_cast<char>(c);
2374 break;
2375 case '\\': t << "\\(\\backslash\\)"; 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 '-': t << "-\\/"; break;
2385 case '^': insideTable ? t << "\\string^" : t << static_cast<char>(c); break;
2386 case '~': t << "\\string~"; break;
2387 case '\n': if (retainNewline) t << "\\newline"; else t << ' ';
2388 break;
2389 case ' ': if (keepSpaces) t << "~"; else t << ' ';
2390 break;
2391 default:
2392 if (c<32) t << ' '; // non printable control character
2393 else t << static_cast<char>(c);
2394 break;
2395 }
2396 }
2397 else
2398 {
2399 switch(c)
2400 {
2401 case 0xef: // handle U+FFFD i.e. "Replacement character" caused by octal: 357 277 275 / hexadecimal 0xef 0xbf 0xbd
2402 // the LaTeX command \ucr has been defined in doxygen.sty
2403 if (static_cast<unsigned char>(*(p)) == 0xbf && static_cast<unsigned char>(*(p+1)) == 0xbd)
2404 {
2405 t << "{\\ucr}";
2406 p += 2;
2407 }
2408 else
2409 t << static_cast<char>(c);
2410 break;
2411 case '#': t << "\\+\\#"; break;
2412 case '$': t << "\\$"; break;
2413 case '%': t << "\\%"; break;
2414 case '^': processEntity(t,pdfHyperlinks,"$^\\wedge$","\\string^"); break;
2415 case '&': {
2416 // possibility to have a special symbol
2417 q = p;
2418 int cnt = 2; // we have to count & and ; as well
2419 while ((*q >= 'a' && *q <= 'z') || (*q >= 'A' && *q <= 'Z') || (*q >= '0' && *q <= '9'))
2420 {
2421 cnt++;
2422 q++;
2423 }
2424 if (*q == ';')
2425 {
2426 --p; // we need & as well
2429 {
2430 p++;
2431 t << "\\&";
2432 }
2433 else
2434 {
2436 q++;
2437 p = q;
2438 }
2439 }
2440 else
2441 {
2442 t << "\\&";
2443 }
2444 }
2445 break;
2446 case '*': processEntity(t,pdfHyperlinks,"$\\ast$","*"); break;
2447 case '_': if (!insideTabbing) t << "\\+";
2448 t << "\\_";
2449 if (!insideTabbing) t << "\\+";
2450 break;
2451 case '{': t << "\\{"; break;
2452 case '}': t << "\\}"; break;
2453 case '<': t << "$<$"; break;
2454 case '>': t << "$>$"; break;
2455 case '|': processEntity(t,pdfHyperlinks,"$\\vert$","|"); break;
2456 case '~': processEntity(t,pdfHyperlinks,"$\\sim$","\\string~"); break;
2457 case '[': if (Config_getBool(PDF_HYPERLINKS) || insideItem)
2458 t << "\\+[";
2459 else
2460 t << "[";
2461 break;
2462 case ']': if (pc=='[') t << "$\\,$";
2463 if (Config_getBool(PDF_HYPERLINKS) || insideItem)
2464 t << "]\\+";
2465 else
2466 t << "]";
2467 break;
2468 case '-': t << "-\\/";
2469 break;
2470 case '\\': t << "\\textbackslash{}";
2471 break;
2472 case '"': t << "\"{}";
2473 break;
2474 case '`': t << "\\`{}";
2475 break;
2476 case '\'': t << "\\textquotesingle{}";
2477 break;
2478 case '\n': if (retainNewline)
2479 {
2480 t << "\\newline";
2481 if (insideTable) t << " ";
2482 }
2483 else
2484 {
2485 t << ' ';
2486 }
2487 break;
2488 case ' ': if (keepSpaces) { if (insideTabbing) t << "\\>"; else t << '~'; } else t << ' ';
2489 break;
2490
2491 default:
2492 //if (!insideTabbing && forceBreaks && c!=' ' && *p!=' ')
2493 if (!insideTabbing &&
2494 ((c>='A' && c<='Z' && pc!=' ' && !(pc>='A' && pc <= 'Z') && pc!='\0' && *p) || (pc=='.' && isId(c)))
2495 )
2496 {
2497 t << "\\+";
2498 }
2499 if (c<32)
2500 {
2501 t << ' '; // non-printable control character
2502 }
2503 else
2504 {
2505 t << static_cast<char>(c);
2506 }
2507 if (!insideTabbing && ((c==':' && *p!=':') || c=='/'))
2508 {
2509 t << "\\+";
2510 }
2511 }
2512 }
2513 pc = c;
2514 }
2515}
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 2569 of file latexgen.cpp.

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

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

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 2615 of file latexgen.cpp.

2616{
2617 if (s.isEmpty()) return s;
2618 TextStream t;
2619 const char *p=s.data();
2620 char c = 0;
2621 while ((c=*p++))
2622 {
2623 switch (c)
2624 {
2625 case '\\': t << "\\textbackslash{}"; 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 << "\\$"; break;
2633 case '^': t << "\\string^"; break;
2634 case '~': t << "\\string~"; break;
2635 default:
2636 t << c;
2637 break;
2638 }
2639 }
2640 return t.str();
2641}

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

Referenced by LatexGenerator::startMemberDoc().

◆ latexFilterURL()

QCString latexFilterURL ( const QCString & s)

Definition at line 2643 of file latexgen.cpp.

2644{
2645 constexpr auto hex = "0123456789ABCDEF";
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 << "\\#"; break;
2655 case '%': t << "\\%"; break;
2656 case '\\': t << "\\\\"; break;
2657 case '\n': break; // ignore
2658 default:
2659 if (c<0)
2660 {
2661 unsigned char id = static_cast<unsigned char>(c);
2662 t << "\\%" << hex[id>>4] << hex[id&0xF];
2663 }
2664 else
2665 {
2666 t << c;
2667 }
2668 break;
2669 }
2670 }
2671 return t.str();
2672}
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 2674 of file latexgen.cpp.

2675{
2676 if (!s1.isEmpty())
2677 {
2678 m_t << "\\index{";
2679 m_t << latexEscapeLabelName(s1);
2680 m_t << "@{";
2681 m_t << latexEscapeIndexChars(s1);
2682 m_t << "}";
2683 if (!s2.isEmpty())
2684 {
2685 m_t << "!";
2686 m_t << latexEscapeLabelName(s2);
2687 m_t << "@{";
2688 m_t << latexEscapeIndexChars(s2);
2689 m_t << "}";
2690 }
2691 m_t << "}\n";
2692 }
2693}
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 2286 of file latexgen.cpp.

2287{
2288 // User-specified packages
2289 const StringVector &extraPackages = Config_getList(EXTRA_PACKAGES);
2290 if (!extraPackages.empty())
2291 {
2292 t << "% Packages requested by user\n";
2293 for (const auto &pkgName : extraPackages)
2294 {
2295 if ((pkgName[0] == '[') || (pkgName[0] == '{'))
2296 t << "\\usepackage" << pkgName << "\n";
2297 else
2298 t << "\\usepackage{" << pkgName << "}\n";
2299 }
2300 t << "\n";
2301 }
2302}
#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 2304 of file latexgen.cpp.

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

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