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

2515{
2516 TextStream t;
2517 filterLatexString(t,s,insideTabbing,false,false,false,keepSpaces);
2518 return t.str();
2519}
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 2344 of file latexgen.cpp.

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

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

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

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

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

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

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

Referenced by LatexGenerator::startMemberDoc().

◆ latexFilterURL()

QCString latexFilterURL ( const QCString & s)

Definition at line 2640 of file latexgen.cpp.

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

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

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

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

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