Saturday, December 9, 2023
Google search engine
HomeUncategorizedLaTeX3: Programming in LaTeX with Ease (2020)

LaTeX3: Programming in LaTeX with Ease (2020)

Many people view LaTeX as a typesetting language and overlook the importance of programming in
document generation process. As a matter of fact, many large and structural documents can benefit
from a programming backend, which enhances layout standardization, symbol coherence, editing speed
and many other aspects. Despite the fact the standard LaTeX (LaTeX2e) is already Turing complete, which
means it is capable of solving any programming task, the design of many programming interfaces is highly
inconsistent due to compatibility considerations. This makes programming with LaTeX2e very challenging and
tedious, even for seasoned computer programmers.

To make programming in LaTeX easier, the LaTeX3 interface is introduced, which aims to provide
modern-programming-language-like syntax and library for LaTeX programmers. Unfortunately, there is
little material regarding this wonderful language. When I started learning it, I had to go through
its complex technical manual, which is time-consuming. Therefore, I decide to write a LaTeX3 tutorial
that is easy-to-understand for generic programmers.

Preface

Why LaTeX3?

Handle macro expansion like a boss

Fundamentally, TeX works by doing macro substitution: commands are substituted by their definition, which is subsequently replaced by definition’s definition, until something irreplaceable is reached (e.g. text). For example, in the following example, myname is substituted by mynameb; mynameb is then substituted by mynama; and eventually, mynamea is replaced by John Doe, which cannot be expanded anymore. This process is called expansion.

newcommand{mynamea}{John Doe}
newcommand{mynameb}{mynamea}
newcommand{myname}{mynameb}
My name is myname.

Most LaTeX command we use everyday has complicated definitions. During compilation, they will be expanded recursively until text or TeX primitive is reached. This process sounds pretty straightforward, until we want to change the order of macro expansion.

Why do we need to change the order of macro expansion? Let’s consider the uppercase macro in LaTeX2e, which turns lowercase letters into uppercase ones. But consider the following case, where we try to apply uppercase to letters abcd and a command cmda. Since cmda expands to abcd, we expect the outcome to be ABCDABCD. In reality, LaTeX gives us ABCDabcd, which means the content of cmda is unchanged.

newcommand{cmda}{abcd}
uppercase{abcdcmda} %ABCDabcd

How can this happen? During the expansion of uppercase, the command scans the item inside the adjacent curly braces one by one. If an English letter is encountered, an uppercase counterpart is left in the output stream; otherwise, the original item is left in the input stream. When it’s cmda’s turn, because it is a command instead of a letter, it is left untouched in the output stream, which is expanded to abcd later.

What if we want to capitalize everything inside the curly braces? That would require the macro cmda to be expanded before uppercase, or equivalently, changing the order of macro expansion. The classical way of doing so in LaTeX is via expandafter. Unfortunately, the usage of expandafter is extremely complicated1: in a string of n tokens2, to expand the ith token, there must be (2^{n-i}-1) expandafter’s before the ith token. Below is a example of how bad this can look like:

documentclass{article}
begin{document}

defx#1#2#3#4{%
  defarga{#2}%
  defargb{#3}%
  defargc{#4}%
  expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter#1%
    expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
      {expandafterexpandafterexpandafterargaexpandafterexpandafterexpandafter}%
        expandafterexpandafterexpandafter{expandafterargbexpandafter}expandafter
          {argc}}

defy#1#2#3{detokenize{#1#2#3}}

xy{arg1}{arg2}{arg3}

end{document}

Clearly, it is nowhere near decency: the excessive number of expandafter’s are sometimes referred to as “expandafter purgatory”. As a result, one of the features of LaTeX3 is to provide simple and reliable expansion control.

Messy interfaces in LaTeX

Believe it or not, LaTeX is able to achieve everything other generic programming languages can do (e.g. C++, Python, Java)3. However, the function call conventions can be wildly distinct across different tasks; some similar functionalities can be independently implemented various packages. Here are some examples:

  • File read
    newreadfile
    openinfile=myfilename.txt
    loopunlessifeoffile
        readfile tofileline % Reads a line of the file into fileline
        % Do something with fileline
    repeat
    closeinfile
    
  • File write
    newwritefile
    immediateopenoutfile=myfilename.txt
    immediatewritefile{A line of text to write to the file}
    immediatewritefile{Another line of text to write to the file}
    closeoutfile
    
  • Integer arithmetic
    newcountmycount
    mycount=numexpr(25+5)/3relax
    advancemycount by -3
    multiplymycount by 2
    
  • Condition
    % command-related if statement
    ifxmycmdundefined
    undefed
    else
      ifmycmd1
      defed, 1
      else
      defed
      fi
    fi
    
    % number-related if statement
    ifdim#1pt=#2pt
        Equal.\
    else%
        Not equal.\
    fi%
    
  • Loop

    % use loop
    newcountfoo
    foo=10
    loop
      message{thefoo}
      advance foo -1
    ifnum foo>0
    repeat
    
    % while loop (provided by `ifthen` package)
    newcounter{ct}
    setcounter{ct}{1}
    whiledo {value{ct} < 5}%
    {
      thect
      stepcounter {ct}%
    }
    
    % for loop (provided by `ifthen` package)
    forloop{ct}{1}{value{ct} < 5}%
    {%
      thect
    }
    

These inconsistencies set a high bar for new LaTeX users and make it difficult to connect multiple components together, even for experienced LaTeX programmers. Therefore, LaTeX3 aims to provide standardized programming interfaces and documentation for the language.

Goals of LaTeX3

LaTeX3 Naming Conventions (I-1)

In the following code snippet, we declare a variable vara and a function cmda. The way we distinguish between a variable and a function is simply by judging whether the command absorbs arguments or not. However, the fact that they are all called “commands” and created with newcommand reflects that they are fundamentally the same for LaTeX system.

newcommand{vara}{this is a variable}
newcommand{cmda}[1]{this is a command: #1}

From users’ perspective, it is important to separate variables from functions because their usages are different. Therefore, our only option is to encode this information into the name of commands, so that users can differentiate variables and functions with little effort. This is why we need to introduce the LaTeX3 naming convention. Before actually elaborating on LaTeX3 naming style, I would like to make a small diversion and introduce category code first.

Category code and command names

In LaTeX, every character that we enter is associated with a category code. Standard category code assignment can be seen in the following table:

When LaTeX encounter a character with category 0 (e.g. ), it continue to scan the subsequent characters, which eventually results in one of the following4:

  1. Multi-letter commands: the character following immediately after the escape character has category code 11 (letter). All subsequent characters that have category code 11 are considered to form the name of a command (control word). TeX will stop looking for characters that form part of a command name when it detects any character that does not have category code 11—such as a space character with category code 10.
  2. Single-letter commands: the character following immediately after the escape character does not have category code 11.

This mechanism shows why we cannot put Arabic numerals or punctuations into command names. Interestingly, the category code associated with a particular character is mutable. That’s the reason why most hidden commands in LaTeX have @ in their names, because the category code of @ is usually 12 (other), which is illegal in command names. In order to access these commands, we need to call makeatletter, which just as the name suggests, changes the category code of @ to 11 (letter). After using hidden commands, we need to call makeatother to reset category code assignment.

In LaTeX3, command names are made up of English letters, underline (_) and colon(:). In order to activate the different naming scheme of LaTeX3, one needs to enter LaTeX3 mode with ExplSyntaxOn and exits with ExplSyntaxOff. In general, ExplSyntaxOn will make the following changes:

  • The category code of _ and : will be set to 11 (letter)
  • All spacers and line breaks will be ignored

Name of variables

  • Public variables: ___
  • Private variables: ____

  • Scope
    • l: local variable
    • g: global variable
    • c: constant
  • Module: the name of module
  • Description: the description of variable
  • Common types:
    • clist: comma separated list
    • dim: dimension
    • fp: floating point number
    • int: integer
    • seq: sequence (similar to queue in other programming languages)
    • str: string
    • tl: token list
    • bool: boolean
    • regex: regular expression
    • prop: property list (similar to dict in Python)
    • ior/iow: IO read/write
  • Examples
    g_my_var_int
    l__testa_clist
    c_left_brace_str
    

Name of functions

When we write C/C++ code, we need to explicit declare the type of each arguments, for example:

int mult(int a, int b){
  return a * b;
}

To increase the readability of LaTeX3 code, a similar design is adopted: detailed information about each argument is specified in .

  • Public functions: _:
  • Private functions: ___:

  • Module: the name of module
  • Description: the description of variable
  • Argument specification: detailed description of each argument encoded in a string
    • n: receives a token list (for now, we can treat token lists as contents enclosed by curly braces)
    • N: receives a command, pass the command itself
    • V:receives a command, pass the value of the command
    • o:similar to n, but expands the token list once
    • x:similar to n, but expands the token list recursively
    • T/F: usually used in if statements: the corresponding T or F code is executed based on the condition
    • p: parameter list, usually consists of #1#2
    • c: receives a token list, pass the command named after the token list (similar to csnameendcsname)

It is worth mentioning that all these naming conventions are merely a suggestion: in most cases, LaTeX3 will not prase the name of the command to acquire information. There is essentially no hard restriction on the name of variables and functions: the scope or public/private identifiers are purely for the sake of users, not the LaTeX3 compiler. However, using consistent naming convention can increase code readibility.

Reading LaTeX3 Documentation

At this moment, most LaTeX3 materials are compiled in The LaTeX3 Interfaces. The first chapter of this document briefly introduces the fundamentals of LaTeX3. Each subsequent chapter elaborates on a module of LaTeX3. Functions are grouped in different sections based on their purposes.

Function documentation

Most items in sections are detailed descriptions about LaTeX3 functions. Take tl_set:Nn as an example:

tl-set-doc

  • All variants of a function is listed in box on the left. According to the screenshot above, the following functions are provided by LaTeX35:
    tl_set:Nn
    tl_set:NV
    tl_gset:Nx
    tl_gset:cx
    
  • The syntax of a function is on the top-right.
  • The detailed description of a function is on the bottom-right.

Scratch variables

Many LaTeX3 modules come with predefined “scratch variables” so that users do not have to declare any variable when the code is small. In every chapter, their is a dedicated section to document what scratch variables (as well as constants) are defined.

tl-set-doc

When writing serious LaTeX3 code, it is recommended to avoid scratch variables to maximize compatibility.

Constants

Some LaTeX3 libraries come with pre-defined constants. They will be introduced in a dedicated section.

tl-set-doc
tl-set-doc

Summary

Functions & Variables

Defining and using variables

Each module of LaTeX3 may use different variable construction format. Therefore, it is important to initialize each variable type with its dedicated function. In general, function ends in new are for declaring new variables; functions that contains set or gset are for modifying variables’ states; functions that contains get are for acquiring variables’ states.

Consider two specific cases tl_set:Nn and tl_gset:Nn, which are both used for modifying a token list’s value. What are the differences? As it turns out, the letter g in gset stands for “global”: usually, LaTeX only sets the value of a variable locally, i.e. within its own group. That is to say, the modified value will not be visible outside the group. Therefore, if we wish a change to be accessible for all functions, we need to use gset variants.

A concrete example:

ExplSyntaxOn
tl_set:Nn l_tmpa_tl {A}
group_begin:
tl_set:Nn l_tmpa_tl {B}
par value~inside~group:~tl_use:N l_tmpa_tl
group_end:
par value~outside~group:~tl_use:N l_tmpa_tl

tl_set:Nn l_tmpb_tl {A} group_begin: tl_gset:Nn l_tmpb_tl {B} par value~inside~group:~tl_use:N l_tmpb_tl group_end: par value~outside~group:~tl_use:N l_tmpb_tl ExplSyntaxOff

The output is:

value inside group: B
value outside group: A
value inside group: B
value outside group: B

It can be seen that tl_set:Nn only modifies the value inside the group and leaves the value outside untouched; while tl_gset:Nn changes both values.

In general, the principles of using LaTeX3 variables are:

  1. Determine the correct variable type and call the corresponding declaration function (if the number of needed variables is small, conside using scratch variables).
  2. Determine the scope and name the variable according to LaTeX3 naming conventions.
  3. Use set or gset functions to modify a variable’s value.
  4. Use corresponding library functions to operate on variables.

Declaring functions (IV-3.2)

In LaTeX3, cs_set:Npn is usually used for declaring functions. Apart from it, there are also other three functions that serve this job, namely cs_set_nopar:Npn, cs_set_protected:Npn and cs_set_protected_nopar:Npn. Because cs_set:Npn is used in most cases, we mainly put our focus on it. In fact, their usages are extremely close.

The procedure of declaring a function is as follows:

  1. Determine the number of arguments and their corresponding types (LaTeX macros can accpet at most 9 arguments)
  2. Name the function according to LaTeX3 naming convention and define the function with one of functions above.

For example, suppose we are to create a function that concatenates its two arguments with comma. Therefore, we know the number of arguments is 2, and both arguments are of type n. As a result, we can name the function my_concat:nn. We can define my_concat:nn like so:

ExplSyntaxOn
%define my_concat:nn
cs_set:Npn my_concat:nn #1#2 {
    #1,~#2
}
%use my_concat:nn
my_concat:nn {a}{b} %result: a, b
ExplSyntaxOff

Copying the definition of existing functions

Sometimes, it is convenient to copy the definition of existing functions. This can be achieved by invoking cs_set_eq:NN. In the following example, we create a LaTeX3 version of section function: my_section:n, and then use it to declare a new “Hello World” section. As we will show later, if a function is declared using LaTeX3 naming convention, its macro expansion control will be more convenient.

ExplSyntaxOn
cs_set_eq:NN my_section:n section
my_section:n {Hello~World}
ExplSyntaxOff

Showing the definition of functions

It is possible to show the definition of a function by using cs_meaning:N. For example, cs_meaning:N section
gives:

long macro:->@startsection {section}{1}{z@ }{-3.5ex @plus -1ex @minus
-.2ex}{2.3ex @plus .2ex}{normalfont Large bfseries }

Summary

Macro Expansion Control (V)

Back to the uppercase example above:

newcommand{cmda}{abcd}
uppercase{abcdcmda} %ABCDabcd

To show how macro expansion can be resolved with LaTeX3, we first create a LaTeX3 equivalent for the function, namely my_uppercase:n. At this point, the behavior of my_uppercase:n is the same as uppercase.

newcommand{cmda}{abcd}
ExplSyntaxOn
cs_set_eq:NN my_uppercase:n uppercase
my_uppercase:n {abcdcmda} % ABCDabcd
ExplSyntaxOff

Now, we discuss two ways to manipulation macro expansion so that the output becomes ABCDABCD (instead of ABCDabcd).

Method 1: change argument specification of functions

At this moment, the argument type of my_uppercase:n is n, which indicates an unexpanded token list. As a matter of fact, every function has n or N type arguments when first declared. Now, we would like to change to type signature to x, i.e. expanding everything in the token list recursively before being passed to my_uppercase. In LaTeX3, there is a function dedicated to changing the argument specification of other functions: cs_generate_variant:Nn. It takes two arguments: the first one is the function we would like to modify; the second one is the new argument specification. Given my_uppercase:n, we can generate my_uppercase:x with the help of cs_generate_variant:Nn and then invoke the new function variant.

newcommand{cmda}{abcd}
ExplSyntaxOn
cs_set_eq:NN my_uppercase:n uppercase
cs_generate_variant:Nn my_uppercase:n {x}
my_uppercase:x {abcdcmda} % ABCDABCD
ExplSyntaxOff

Important Notice: cs_generate_variant:Nn only works for functions following LaTeX3 naming convention.

Method 2: use exp_args:N functions (V.4, V.5, V.6)

Declaring new variants with cs_generate_variant:Nn frequently may be a bit inconvenient. Fortunately, LaTeX3 provides a series of exp_args:N functions that can facilitate macro expansion control when the number of arguments in small.

In short, if we use cs_generate_variant:Nn to generate and use a new variant function:

cs_generate_variant:Nn func:abcd {efgh}
func:efgh {1}{2}{3}{4}

It will be equivalent to the following exp_args:N function call:

exp_args:Nefgh func:abcd {1}{2}{3}{4}

Using exp_args:N functions, we can also fully expand the argument for my_uppercase:n:

newcommand{cmda}{abcd}
ExplSyntaxOn
cs_set_eq:NN my_uppercase:n uppercase
exp_args:Nx my_uppercase:n {abcdcmda} %ABCDABCD
ExplSyntaxOff

It is worth noticing that exp_args:N functions can be used to control expansion partially. For example, if a function takes three arguments, and we apply exp_args:Nc to it, then only the first argument will be modified, while the rest are left untouched. In the example below, we apply c type exansion to the first argument of NewDocumentCommand from xparse package, which allows us to declare a command named after the content stored in a variable.

% load `xparse` package for this example (will be automatically loaded for newer TeX versions)
ExplSyntaxOn
% store command name in a variable
tl_set:Nn l_tmpa_tl {mycmd}

% use exp_args:Nc to expand the first arguemnt only
% which allows us to declare a command using the content of l_tmpa_tl
exp_args:Nc NewDocumentCommand{l_tmpa_tl}{m}{
  par you~entered~#1
}

% you entered something
mycmd{something}
ExplSyntaxOff

Summary

LaTeX3: Token List and String

Token list (VII)

Everything that is entered in a tex file can be interpreted as a token. Therefore, token lists are collections of all objects recognized by the LaTeX compiler. In LaTeX3, token lists are the most fundamental and frequently used variable type.

Constructing a command in token list

Suppose we would like to call section*{<span>}</span></code>, and the <code><title></code> is stored in the token list variable <code><span>l_tmpa_tl</span></code>. We can do it as follows:</p> <div> <pre><span></span><span>ExplSyntaxOn</span> <span>% put the title in l_tmpa_tl</span> <span>tl_set</span><span>:Nn</span> <span>l_tmpa_tl</span> <span>{</span>My~Title<span>}</span> <span>% construct the command in l_tmpb_tl</span> <span>tl_set</span><span>:Nx</span> <span>l_tmpb_tl</span> <span>{</span><span>exp_not</span><span>:N</span> <span>section*</span> <span>{</span><span>l_tmpa_tl</span><span>}}</span> <span>cs_meaning</span><span>:N</span> <span>l_tmpb_tl</span> <span>% macro:->section *{My Title}</span> <span>% place the content of l_tmpb_tl into the input stream</span> <span>tl_use</span><span>:N</span> <span>l_tmpb_tl</span> <span>ExplSyntaxOff</span> </pre> </div> <p>In this case, we are using <code><span>tl_set</span><span>:Nx</span></code>, which means everything inside the curly braces will be expanded completely and recursively. As a result, in the definition of <code><span>l_tmpb_tl</span></code>, the variable name <code><span>l_tmpa_tl</span></code> will be replaced by its <em>value</em> (expanded recursively). Since we do not want to expand the definition of <code><span>section</span></code>, we use <code><span>exp_not</span><span>:N</span></code> to suppress its expansion.</p> <p>The <code>x</code> expansion might cause problems when the content of <code><span>l_tmpa_tl</span></code> contains commands.<br /> If we only want to put the value of <code><span>l_tmpa_tl</span></code> surrounded by curly braces in <code><span>l_tmpb_tl</span></code>, we can use <code><span>exp_not</span><span>:V</span></code> in <code><span>tl_set</span><span>:Nx</span></code> as follows:<br /> <code><span>tl_set</span><span>:Nx</span> <span>l_tmpb_tl</span> <span>{</span><span>exp_not</span><span>:N</span> <span>section*</span> <span>{</span><span>exp_not</span><span>:V</span><span>l_tmpa_tl</span><span>}}</span></code>.<br /> When being expanded, the <code><span>exp_not</span><span>:V</span></code> command will place the value of the next variable in the output and prevent the value from being further expanded.</p> <h4 id="student-management-system">Student management system</h4> <p>Suppose we want to set up an internal student management system in <img decoding="async" alt="LaTeX" src="http://www.alanshawn.com/media/2020/latex3/latex.svg"></img>. We would like to implement the following three commands:</p> <ul> <li><code><span>student</span></code>: add a new student into the system</li> <li><code><span>allstudent</span></code>: show all students, separated by commas</li> <li><code><span>thestudent</span></code>: takes one argument and shows the (i)-th student</li> </ul> <p>We will reuse this example many times throughout this tutorial, but with different implementation techniques. Here, we use token list related functions to implement the three commands above.</p> <div> <pre><span></span><span>documentclass</span><span>{</span>article<span>}</span> <span>usepackage</span><span>[T1]</span><span>{</span>fontenc<span>}</span> <span>usepackage</span><span>{</span>expl3<span>}</span> <span>usepackage</span><span>{</span>amsmath, amssymb<span>}</span> <span>begin</span><span>{</span>document<span>}</span> <span>ExplSyntaxOn</span> <span>% stores all students, separated by commas</span> <span>tl_new</span><span>:N</span> <span>l_student_comma_tl</span> <span>% stores the name of each student</span> <span>tl_new</span><span>:N</span> <span>l_student_group_tl</span> <span>newcommand</span><span>{</span><span>student</span><span>}</span>[1]<span>{</span> #1<span>% outputs student's name</span> <span>% check if l_student_comma_tl is empty</span> <span>% this is a conditional branch statement</span> <span>% which we will discuss in the subsequent sections</span> <span>tl_if_empty</span><span>:NTF</span> <span>l_student_comma_tl</span> <span>{</span> <span>% if empty, do not prepend comma before name</span> <span>tl_put_right</span><span>:Nn</span> <span>l_student_comma_tl</span> <span>{</span>#1<span>}</span> <span>}</span> <span>{</span> <span>% otherwise, prepend comma before name</span> <span>tl_put_right</span><span>:Nn</span> <span>l_student_comma_tl</span> <span>{</span>,~#1<span>}</span> <span>}</span> <span>% put student name in a group and</span> <span>% store it in l_student_group_tl</span> <span>tl_put_right</span><span>:Nn</span> <span>l_student_group_tl</span> <span>{{</span>#1<span>}}</span> <span>}</span> <span>newcommand</span><span>{</span><span>allstudent</span><span>}{</span> <span>% outputs l_student_comma_tl</span> <span>tl_use</span><span>:N</span> <span>l_student_comma_tl</span> <span>}</span> <span>newcommand</span><span>{</span><span>thestudent</span><span>}</span>[1]<span>{</span> <span>% outputs the #1-th token in l_student_group_tl</span> <span>tl_item</span><span>:Nn</span> <span>l_student_group_tl</span> <span>{</span>#1<span>}</span> <span>}</span> <span>ExplSyntaxOff</span> <span>% John and Lisa and David and Emily</span> <span>student</span><span>{</span>John<span>}</span> and <span>student</span><span>{</span>Lisa<span>}</span> and <span>student</span><span>{</span>David<span>}</span> and <span>student</span><span>{</span>Emily<span>}</span> <span>% John, Lisa, David, Emily</span> <span>parallstudent</span> <span>% Emily and David and Lisa and John</span> <span>parthestudent</span><span>{</span>4<span>}</span> and <span>thestudent</span><span>{</span>3<span>}</span> and <span>thestudent</span><span>{</span>2<span>}</span> and <span>thestudent</span><span>{</span>1<span>}</span> <span>end</span><span>{</span>document<span>}</span> </pre> </div> <ul> <li>In this solution, we store each name twice in <code><span>l_student_comma_tl</span></code> and <code><span>l_student_group_tl</span></code>. <code><span>l_student_comma_tl</span></code> stores the name of all students, joined by commas, which is used by <code><span>allstudent</span></code>. <code><span>l_student_group_tl</span></code> allows index access for student names, for each student is saved as a group in the token list. Every time one calls <code><span>student</span></code>, the new student name will be inserted into the two token lists.</li> <li>When inserting into <code><span>l_student_comma_tl</span></code>, there is no need to prepend comma if it is the first name. Therefore, we need to use the conditional statement <code><span>tl_if_empty</span><span>:NTF</span></code> to specify this behavior.</li> <li>Notice that we surround the student name with curly braces when inserting into <code><span>l_student_group_tl</span></code>, which effectively encapsulates each student name inside a group. As a result, when calling <code><span>tl_item</span><span>:Nn</span></code>, the entire group will be returned, which allows us to retrieve the student name as a whole.</li> </ul> <h3 id="string-viii">String (VIII)</h3> <p>A close relative to token list is <em>string</em>. When we apply <code><span>tl_use</span><span>:N</span></code> to a token list variable, it is equivalent to typing its content directly in the <code>tex</code> file. If we run the following example</p> <div> <pre><span></span><span>newcommand</span><span>{</span><span>cmda</span><span>}{</span>efgh<span>}</span> <span>ExplSyntaxOn</span> <span>tl_set</span><span>:Nn</span> <span>l_tmpa_tl</span> <span>{</span>abcd<span>cmda</span><span>}</span> <span>tl_use</span><span>:N</span> <span>l_tmpa_tl</span> <span>%abcdefgh</span> <span>ExplSyntaxOff</span> </pre> </div> <p>then we will get <code>abcdegfh</code> in the document output, because <code><span>cmda</span></code> is stored as a command in <code><span>l_tmpa_tl</span></code>, which is subsequently expanded to <code>efgh</code>. However, If we run the same example with string type, then everything inside the string variable will be interpereted as text instead of command of special character. Consequently, the output in the document becomes <code>abcdcmda</code>.</p> <div> <pre><span></span><span>newcommand</span><span>{</span><span>cmda</span><span>}{</span>efgh<span>}</span> <span>ExplSyntaxOn</span> <span>str_set</span><span>:Nn</span> <span>l_tmpa_str</span> <span>{</span>abcd<span>cmda</span><span>}</span> <span>str_use</span><span>:N</span> <span>l_tmpa_str</span> <span>%abcdcmda</span> <span>ExplSyntaxOff</span> </pre> </div> <p>We can use <code><span>tl_to_str</span><span>:n</span></code> to convert a token list into a string. It is possible to transform strings back to token lists with <code><span>tl_rescan</span><span>:nn</span></code><sup id="fnref:6" role="doc-noteref"><a href="http://www.alanshawn.com/#fn:6" rel="footnote">6</a></sup>.</p> <h4 id="vertical-text-node-in-tikz">Vertical text node in TikZ</h4> <div> <pre><span></span><span>ExplSyntaxOn</span> <span>cs_set</span><span>:Npn</span> <span>my_vert_str</span><span>:n</span> #1 <span>{</span> <span>% store argument as string</span> <span>str_set</span><span>:Nn</span> <span>l_tmpa_str</span> <span>{</span>#1<span>}</span> <span>% traverse the string</span> <span>str_map_inline</span><span>:Nn</span> <span>l_tmpa_str</span> <span>{</span> <span>% center each character at their own line</span> <span>centering</span> ##1 <span>par</span> <span>}</span> <span>}</span> <span>% declare latex interface</span> <span>newcommand</span><span>{</span><span>vertstr</span><span>}</span>[1]<span>{</span> <span>my_vert_str</span><span>:n</span> <span>{</span>#1<span>}</span> <span>}</span> <span>ExplSyntaxOff</span> <span>begin</span><span>{</span>tikzpicture<span>}</span> <span>node</span><span>[draw=black, text width=1cm]</span> <span>{</span><span>vertstr</span><span>{</span>ab<span>$</span><span>c</span><span>$</span>d~<span>\\</span><span>}}</span>; <span>end</span><span>{</span>tikzpicture<span>}</span> </pre> </div> <p>Output:</p> <p><img decoding="async" src="http://www.alanshawn.com/media/2020/latex3/vert-node.png"></img> </p> <div> <p><img decoding="async" alt="LaTeX3" src="http://www.alanshawn.com/media/2020/latex3/latex3.svg"></img>’s string method is implemented with <code><span>detokenize</span></code>. As a result, neither <code><span>tl_to_str</span><span>:n</span></code> nor <code><span>str_set</span><span>:Nn</span></code> can guarantee that the string output is <strong>exactly the same as users’ input</strong>. For example, <code><span>detokenize</span></code> adds an extra space after commands. That is, <code><span>verb</span>|abc|</code> becomes <code><span>verb</span> |abc|</code>. This can be tricky in some scenarios.</p> </div> <div> <p>Very frequently, we need to compare if two token lists or strings are equal. Since the token list library and string library both have their own equality functions, we can choose between <code><span>tl_if_eq</span><span>:</span></code> (from token list library) and <code><span>str_if_eq</span><span>:</span></code> (from string library). Unless it is absolutely necessary, <strong>it is recommended to use string library’s comparision functions</strong>. That is because <code><span>tl_if_eq</span><span>:</span></code> not only checks if the characters are the same, but it also checks if the category code of each character is the same. As a result, two seemingly identical variables can result in <code>False</code> outcome when using <code><span>tl_if_eq</span><span>:</span></code>.</p> </div> <h2 id="latex3-numeric-evaluation-and-boolean-logic">LaTeX3: Numeric Evaluation and Boolean Logic</h2> <p>This section mainly consists of code snippets with detailed comments, for the underlying methodology of these topics are similar to other programming languages. Therefore, it is more beneficial to be able to locate the correct APIs in <img decoding="async" alt="LaTeX3" src="http://www.alanshawn.com/media/2020/latex3/latex3.svg"></img> documentation.</p> <h3 id="boolean-logic-xiii">Boolean logic (XIII)</h3> <div> <pre><span></span><span>ExplSyntaxOn</span> <span>% declare new boolean value</span> <span>bool_new</span><span>:N</span> <span>l_my_bool</span> <span>% set to true</span> <span>bool_set_true</span><span>:N</span> <span>l_my_bool</span> <span>% set to false</span> <span>bool_set_false</span><span>:N</span> <span>l_my_bool</span> <span>% boolean based conditional statement</span> <span>bool_if</span><span>:nTF</span> <span>{</span><span>l_my_bool</span><span>}</span> <span>{</span>true<span>}</span> <span>{</span>false<span>}</span> <span>%false</span> <span>% boolean based while loop</span> <span>bool_do_while</span><span>:nn</span> <span>{</span><span>l_my_bool</span><span>}</span> <span>{}</span> <span>% boolean based until loop</span> <span>% boolean functions support C/C++</span> <span>% style !, || and && operations</span> <span>bool_do_until</span><span>:nn</span> <span>{</span>!<span>l_my_bool</span><span>}</span> <span>{}</span> <span>ExplSyntaxOff</span> </pre> </div> <h3 id="integer-arithmetic">Integer arithmetic</h3> <h4 id="implementing-modulo-operation">Implementing modulo operation</h4> <p>It is worth noticing that <img decoding="async" alt="LaTeX3" src="http://www.alanshawn.com/media/2020/latex3/latex3.svg"></img> already has <code><span>int_mod</span><span>:nn</span></code>. This sample is for demonstration purposes.</p> <div> <pre><span></span><span>ExplSyntaxOn</span> <span>cs_set</span><span>:Npn</span> <span>my_mod</span><span>:nn</span> #1#2 <span>{</span> <span>% store #1//#2 in l_tmpa_int</span> <span>int_set</span><span>:Nn</span> <span>l_tmpa_int</span> <span>{</span> <span>int_div_truncate</span><span>:nn</span> <span>{</span>#1<span>}{</span>#2<span>}</span> <span>}</span> <span>% compute (#1)-l_tmpa_int*(#2)</span> <span>% make sure to surround operands with parentheses</span> <span>% so that when #1 is an expression (e.g. 3-2)</span> <span>% the order of arithmetic will not change</span> <span>int_eval</span><span>:n</span> <span>{</span> (#1) - <span>l_tmpa_int</span> * (#2) <span>}</span> <span>}</span> <span>% define LaTeX interface</span> <span>newcommand</span><span>{</span><span>mymod</span><span>}</span>[2]<span>{</span> <span>my_mod</span><span>:nn</span> <span>{</span>#1<span>}</span> <span>{</span>#2<span>}</span> <span>}</span> <span>ExplSyntaxOff</span> <span>mymod</span><span>{</span>5<span>}{</span>3<span>}</span><span>mymod</span><span>{</span>6<span>}{</span>3<span>}</span><span>mymod</span><span>{</span>7<span>}{</span>1+2<span>}</span><span>%201</span> </pre> </div> <h4 id="implementing-caesar-cipher">Implementing Caesar cipher</h4> <p><a href="https://en.wikipedia.org/wiki/Caesar_cipher">Caesar cipher</a> is a classic substitution cipher in cryptography.</p> <div> <pre><span></span><span>ExplSyntaxOn</span> <span>cs_set</span><span>:Npn</span> <span>my_caesar_cipher</span><span>:n</span> #1 <span>{</span> <span>% transform #1 to lower case and store in l_tmpa_str</span> <span>str_set</span><span>:Nx</span> <span>l_tmpa_str</span> <span>{</span><span>tl_lower_case</span><span>:n</span> <span>{</span>#1<span>}}</span> <span>% clear l_tmpb_str to store results</span> <span>str_clear</span><span>:N</span> <span>l_tmpb_str</span> <span>% str_map_inline:Nn traverses the string</span> <span>% and pass each character as first argument</span> <span>str_map_inline</span><span>:Nn</span> <span>l_tmpa_str</span> <span>{</span> <span>% `##1 gives the ASCII code of ##1</span> <span>% 91 is the ASCII code of 'a'</span> <span>% this allows us to compute the offset of ##1</span> <span>int_set</span><span>:Nn</span> <span>l_tmpa_int</span> <span>{</span> <span>int_eval</span><span>:n</span> <span>{</span>`##1 - 97<span>}</span> <span>}</span> <span>% suppose the shifting of our Ceaser cipher is 3</span> <span>int_set</span><span>:Nn</span> <span>l_tmpb_int</span> <span>{</span> <span>int_mod</span><span>:nn</span> <span>{</span><span>l_tmpa_int</span> + 3<span>}{</span>26<span>}</span> <span>}</span> <span>% place new character in l_tmpb_str</span> <span>str_put_right</span><span>:Nx</span> <span>l_tmpb_str</span> <span>{</span> <span>% this function generates a character given</span> <span>% character code and category code</span> <span>% because we are dealing with English letters</span> <span>% the category code is 11</span> <span>char_generate</span><span>:nn</span> <span>{</span><span>l_tmpb_int</span> + 97<span>}{</span>11<span>}</span> <span>}</span> <span>}</span> <span>% outputs l_tmpb_str</span> <span>str_use</span><span>:N</span> <span>l_tmpb_str</span> <span>}</span> <span>my_caesar_cipher</span><span>:n</span> <span>{</span>helloworld<span>}</span><span>%khoorzruog</span> <span>ExplSyntaxOff</span> </pre> </div> <h3 id="integer-based-loop-and-condition">Integer-based loop and condition</h3> <p>Common integer-based conditional statements:</p> <ol> <li><code><span>int_compare_p</span><span>:</span></code> series: compare two integers given a relation and returns a boolean value</li> <li><code><span>int_compare</span><span>:</span></code> series: compare two integers given a relation and execute <code>T</code> code or <code>F</code> code based on the result</li> </ol> <p>Common integer-based loops:</p> <ol> <li><code><span>int_do_while</span><span>:</span></code> series</li> <li><code><span>int_do_until</span><span>:</span></code> series</li> <li><code><span>int_step_function</span><span>:</span></code>, <code><span>int_step_inline</span><span>:</span></code> and <code><span>int_step_variable</span><span>:</span></code></li> </ol> <p>1, 2 are often used with <code><span>int_incr</span><span>:N</span></code> (<code><span>int_gincr</span><span>:N</span></code>) and <code><span>int_decr</span><span>:N</span></code> (<code><span>int_gdecr</span><span>:N</span></code>)</p> <div> <p>One may have noticed that most integer related comparions provide <code>:n</code> and :nNn` variants. They are different in the following ways:</p> <ul> <li><code>:nNn</code> only supports three types of comparsion: <code><</code>, <code>></code> and <code>=</code></li> <li>In addition to <code><</code>, <code>></code> and <code>==</code>, <code>:n</code> also supports <code>>=</code>, <code><=</code> and <code>!=</code></li> <li><code>:n</code> supports chained comparison: <code>a<b<c</code></li> <li>The speed of <code>:n</code> is about one fifth of the speed of <code>:nNn</code></li> </ul> <div> <pre><span></span><span>int_compare_p</span><span>:nNn</span> <span>{</span><span>l_tmpa_int</span><span>}</span> < <span>{</span><span>l_tmpb_int</span><span>}</span> <span>% is equivalant to </span> <span>int_compare_p</span><span>:n</span> <span>{</span><span>l_tmpa_int</span> < <span>l_tmpb_int</span><span>}</span> </pre> </div> </div> <h4 id="computing-the-greatest-common-divisor-non-recursive">Computing the greatest common divisor (non-recursive)</h4> <p>We implement the <a href="https://en.wikipedia.org/wiki/Euclidean_algorithm">Eulidean algorithm</a> to compute the greatest common divisor.</p> <div> <pre><span></span><span>ExplSyntaxOn</span> <span>% declare one more scratch variable</span> <span>int_new</span><span>:N</span> <span>l_tmpc_int</span> <span>cs_set</span><span>:Npn</span> <span>my_gcd</span><span>:nn</span> #1#2 <span>{</span> <span>% put #1 in l_tmpa_int</span> <span>int_set</span><span>:Nn</span> <span>l_tmpa_int</span> <span>{</span>#1<span>}</span> <span>% put #2 in l_tmpb_int</span> <span>int_set</span><span>:Nn</span> <span>l_tmpb_int</span> <span>{</span>#2<span>}</span> <span>% loop until l_tmpb_int equals 0</span> <span>int_do_until</span><span>:nNnn</span> <span>{</span><span>l_tmpb_int</span><span>}</span> = <span>{</span>0<span>}</span> <span>{</span> <span>% update three variables</span> <span>int_set</span><span>:Nn</span> <span>l_tmpc_int</span> <span>{</span> <span>l_tmpb_int</span> <span>}</span> <span>int_set</span><span>:Nn</span> <span>l_tmpb_int</span> <span>{</span> <span>int_mod</span><span>:nn</span> <span>{</span><span>l_tmpa_int</span><span>}{</span><span>l_tmpb_int</span><span>}</span> <span>}</span> <span>int_set</span><span>:Nn</span> <span>l_tmpa_int</span> <span>{</span><span>l_tmpc_int</span><span>}</span> <span>}</span> <span>% outputs l_tmpa_int</span> <span>int_use</span><span>:N</span> <span>l_tmpa_int</span> <span>}</span> <span>my_gcd</span><span>:nn</span> <span>{</span>6<span>}{</span>3<span>}</span>~<span>my_gcd</span><span>:nn</span> <span>{</span>270<span>}{</span>192<span>}</span><span>% 3 6</span> <span>ExplSyntaxOff</span> </pre> </div> <h4 id="computing-the-greatest-common-divisor-recursive">Computing the greatest common divisor (recursive)</h4> <p>As mentioned above, compared to <code>gset</code> functions, <code>set</code> functions only modify variable values within the current group. Using this mechanism, it is possible to imitate a callstack in other programming languages to implement recursive algorithms. In the following example, it is shown that local varialbles will not be modified by subroutines because each <code>set</code> function is guarded by <code><span>group_begin</span><span>:</span></code> and <code><span>group_end</span><span>:</span></code>.</p> <div> <pre><span></span><span>ExplSyntaxOn</span> <span>cs_set</span><span>:Npn</span> <span>my_gcd_recursive</span><span>:nn</span> #1#2 <span>{</span> <span>group_begin</span><span>:</span> <span>% all variable assignments will be constrained in this group</span> <span>int_compare</span><span>:nNnTF</span> <span>{</span>#2<span>}</span> = <span>{</span>0<span>}</span> <span>{</span> <span>int_gset</span><span>:Nn</span> <span>g_tmpa_int</span> <span>{</span>#1<span>}</span> <span>}</span> <span>{</span> <span>int_set</span><span>:Nn</span> <span>l_tmpa_int</span> <span>{</span><span>int_mod</span><span>:nn</span> <span>{</span>#1<span>}{</span>#2<span>}}</span> <span>int_set</span><span>:Nn</span> <span>l_tmpb_int</span> <span>{</span><span>int_div_truncate</span><span>:nn</span> <span>{</span>#1<span>}{</span>#2<span>}}</span> <span>exp_args</span><span>:Nnx</span> <span>my_gcd_recursive</span><span>:nn</span> <span>{</span>#2<span>}</span> <span>{</span><span>int_use</span><span>:N</span> <span>l_tmpa_int</span><span>}</span> <span>% output debug message</span> <span>par</span> <span>$</span><span>int</span><span>_use:N </span><span>l</span><span>_tmpb_int </span><span>times</span><span> #</span><span>2</span><span> </span><span>+</span><span> </span><span>int</span><span>_use:N </span><span>l</span><span>_tmpa_int </span><span>=</span><span> #</span><span>1</span><span>$</span> <span>}</span> <span>group_end</span><span>:</span> <span>}</span> <span>my_gcd_recursive</span><span>:nn</span> <span>{</span>12546<span>}{</span>156<span>}</span> <span>par</span> <span>$</span><span>operatorname</span><span>{gcd}</span><span>(</span><span>12546</span><span>, </span><span>156</span><span>)</span><span> </span><span>=</span><span> </span><span>int</span><span>_use:N </span><span>g</span><span>_tmpa_int</span><span>$</span> <span>ExplSyntaxOff</span> </pre> </div> <p>Output:</p> <div> <div> <pre><code>3 × 6 + 0 = 18 1 × 18 + 6 = 24 2 × 24 + 18 = 66 2 × 66 + 24 = 156 80 × 156 + 66 = 12546 gcd(12546; 156) = 6 </code></pre> </div> </div> <h4 id="student-management-system-1">Student management system</h4> <p>Now, we implement the aforementioned student management system with integer related functions.</p> <div> <pre><span></span><span>ExplSyntaxOn</span> <span>% used to store the name of each student</span> <span>tl_new</span><span>:N</span> <span>l_student_group_tl</span> <span>newcommand</span><span>{</span><span>student</span><span>}</span>[1]<span>{</span> #1<span>% outputs student name</span> <span>% put student name in group and then</span> <span>% insert into l_student_group_tl</span> <span>tl_put_right</span><span>:Nn</span> <span>l_student_group_tl</span> <span>{{</span>#1<span>}}</span> <span>}</span> <span>newcommand</span><span>{</span><span>allstudent</span><span>}{</span> <span>%tl_count:N returns the length of a token list</span> <span>%int_step_inline:nn traverses all integers in </span> <span>% the range (1, #1) and pass the loop variable as</span> <span>% #1</span> <span>int_step_inline</span><span>:nn</span> <span>{</span><span>tl_count</span><span>:N</span> <span>l_student_group_tl</span><span>}{</span> <span>% get the ##1-th element from l_student_group_tl</span> <span>tl_item</span><span>:Nn</span> <span>l_student_group_tl</span> <span>{</span>##1<span>}</span> <span>% determine if it is the last element</span> <span>% otherwise, append comma</span> <span>int_compare</span><span>:nNnTF</span> <span>{</span>##1<span>}</span> = <span>{</span><span>tl_count</span><span>:N</span> <span>l_student_group_tl</span><span>}</span> <span>{}</span> <span>{</span>,~<span>}</span> <span>}</span> <span>}</span> <span>newcommand</span><span>{</span><span>thestudent</span><span>}</span>[1]<span>{</span> <span>% outputs the #1-th item in l_student_group_tl</span> <span>tl_item</span><span>:Nn</span> <span>l_student_group_tl</span> <span>{</span>#1<span>}</span> <span>}</span> <span>ExplSyntaxOff</span> <span>% John and Lisa and David and Emily</span> <span>student</span><span>{</span>John<span>}</span> and <span>student</span><span>{</span>Lisa<span>}</span> and <span>student</span><span>{</span>David<span>}</span> and <span>student</span><span>{</span>Emily<span>}</span> <span>% John, Lisa, David, Emily</span> <span>parallstudent</span> <span>% Emily and David and Lisa and John</span> <span>parthestudent</span><span>{</span>4<span>}</span> and <span>thestudent</span><span>{</span>3<span>}</span> and <span>thestudent</span><span>{</span>2<span>}</span> and <span>thestudent</span><span>{</span>1<span>}</span> </pre> </div> <h4 id="three-ways-to-implement-nested-loop">Three ways to implement nested loop</h4> <div> <pre><span></span><span>ExplSyntaxOn</span> <span>par</span> <span>int_step_variable</span><span>:nNn</span> <span>{</span>4<span>}</span> <span>l_tmpa_tl</span> <span>{</span> <span>int_step_variable</span><span>:nNn</span> <span>{</span>4<span>}</span> <span>l_tmpb_tl</span><span>{</span> (<span>l_tmpa_tl</span>,<span>l_tmpb_tl</span>) <span>}</span> <span>}</span> <span>par</span> <span>int_step_inline</span><span>:nn</span> <span>{</span>4<span>}</span> <span>{</span> <span>int_step_inline</span><span>:nn</span> <span>{</span>4<span>}</span> <span>{</span> (#1,##1) <span>}</span> <span>}</span> <span>par</span> <span>int_set</span><span>:Nn</span> <span>l_tmpa_int</span> <span>{</span>1<span>}</span> <span>int_do_while</span><span>:nNnn</span> <span>{</span><span>l_tmpa_int</span><span>}</span> < <span>{</span>5<span>}</span> <span>{</span> <span>int_set</span><span>:Nn</span> <span>l_tmpb_int</span> <span>{</span>1<span>}</span> <span>int_do_while</span><span>:nNnn</span> <span>{</span><span>l_tmpb_int</span><span>}</span> < <span>{</span>5<span>}</span> <span>{</span> (<span>int_use</span><span>:N</span> <span>l_tmpa_int</span>,<span>int_use</span><span>:N</span> <span>l_tmpb_int</span>) <span>int_incr</span><span>:N</span> <span>l_tmpb_int</span> <span>}</span> <span>int_incr</span><span>:N</span> <span>l_tmpa_int</span> <span>}</span> <span>ExplSyntaxOff</span> </pre> </div> <p>Output:</p> <div> <div> <pre><code>(1,1)(1,2)(1,3)(1,4)(2,1)(2,2)(2,3)(2,4)(3,1)(3,2)(3,3)(3,4)(4,1)(4,2)(4,3)(4,4) (1,1)(1,2)(1,3)(1,4)(2,1)(2,2)(2,3)(2,4)(3,1)(3,2)(3,3)(3,4)(4,1)(4,2)(4,3)(4,4) (1,1)(1,2)(1,3)(1,4)(2,1)(2,2)(2,3)(2,4)(3,1)(3,2)(3,3)(3,4)(4,1)(4,2)(4,3)(4,4) </code></pre> </div> </div> <h4 id="drawing-a-square-number-grid-in-tikz">Drawing a square number grid in TikZ</h4> <div> <pre><span></span><span>tikzset</span><span>{</span> mynode/.style=<span>{</span> minimum height=1cm, minimum width=1cm, draw, anchor=north west <span>}</span> <span>}</span> <span>ExplSyntaxOn</span> <span>begin</span><span>{</span>tikzpicture<span>}</span> <span>int_step_inline</span><span>:nn</span> <span>{</span>6<span>}</span> <span>{</span> <span>int_step_inline</span><span>:nn</span> <span>{</span>8<span>}</span> <span>{</span> <span>node</span><span>[mynode]</span> at (##1, -#1) <span>{</span><span>tiny</span> <span>int_eval</span><span>:n</span> <span>{</span>(#1 - 1) * 8 + ##1<span>}}</span>; <span>}</span> <span>}</span> <span>end</span><span>{</span>tikzpicture<span>}</span> <span>ExplSyntaxOff</span> </pre> </div> <p>Output:</p> <p><img decoding="async" src="http://www.alanshawn.com/media/2020/latex3/number-grid-1.png"></img> </p> <h3 id="floating-point-number-xxiii-and-dimension-xx">Floating point number (XXIII) and dimension (XX)</h3> <p>The usage of floating point numbers is similar to that of integers: they all have their corresponding <code>new</code>, <code>set</code>, <code>eval</code> and <code>compare</code> functions. It is worth noticing that <code><span>fp_eval</span><span>:n</span></code> supports a series of scientific functions, which is demonstrated below.</p> <div> <pre><span></span><span>ExplSyntaxOn</span> <span>fp_set</span><span>:Nn</span> <span>l_tmpa_fp</span> <span>{</span>2.0<span>}</span> <span>parfp_eval</span><span>:n</span> <span>{</span>sqrt(<span>l_tmpa_fp</span>)<span>}</span><span>% 1.414213562373095</span> <span>parfp_eval</span><span>:n</span> <span>{</span>sin(<span>l_tmpa_fp</span>)<span>}</span><span>% 0.9092974268256817</span> <span>par</span> <span>fp_eval</span><span>:n</span> <span>{</span>sin(<span>c_pi_fp</span>)<span>}</span><span>% 0.0000000000000002384626433832795</span> <span>ExplSyntaxOff</span> </pre> </div> <p>It is worth noticing that <img decoding="async" alt="LaTeX3" src="http://www.alanshawn.com/media/2020/latex3/latex3.svg"></img>’s floating point library is written in pure <img decoding="async" alt="LaTeX" src="http://www.alanshawn.com/media/2020/latex3/latex.svg"></img>, which means it differs from IEEE 754 floating point numbers fundamentally. Nonetheless, after a series of experiments, it is shown that <code>l3fp</code>’s arithmetic accuracy is almost identical to IEEE 754 floating point. The discrapency is neglectable in everyday scenarios <sup id="fnref:7" role="doc-noteref"><a href="http://www.alanshawn.com/#fn:7" rel="footnote">7</a></sup>.</p> <p>Floating points are similar to dimensions, except that dimensions are floating point numbers with a unit (usually in <code>pt</code>). In <img decoding="async" alt="LaTeX3" src="http://www.alanshawn.com/media/2020/latex3/latex3.svg"></img>, dimension variables are represented using IEEE 754 (single precision) floating point internally. Therefore, their processing speed is much faster than <code>l3fp</code>. Dimension variables and floating point variables can be converted from one another using <code><span>dim_to_fp</span><span>:n</span></code> and <code><span>fp_to_dim</span><span>:n</span></code>. It is possible to use dimension varialble directly in <code><span>fp_eval</span><span>:n</span></code>. In this case, dimensions will be converted into <code>pt</code> and lose their unit.</p> <h4 id="drawing-a-rectangular-number-grid-in-tikz">Drawing a rectangular number grid in TikZ</h4> <div> <pre><span></span><span>ExplSyntaxOn</span> <span>% set width and height of each cell</span> <span>dim_new</span><span>:N</span> <span>l_w_dim</span> <span>dim_set</span><span>:Nn</span> <span>l_w_dim</span> <span>{</span>1.2cm<span>}</span> <span>dim_new</span><span>:N</span> <span>l_h_dim</span> <span>dim_set</span><span>:Nn</span> <span>l_h_dim</span> <span>{</span>0.5cm<span>}</span> <span>tikzset</span><span>{</span> mynode/.style=<span>{</span> minimum~height=<span>l_h_dim</span>, minimum~width=<span>l_w_dim</span>, draw, anchor=north~west <span>}</span> <span>}</span> <span>begin</span><span>{</span>tikzpicture<span>}</span> <span>int_step_inline</span><span>:nn</span> <span>{</span>6<span>}</span> <span>{</span> <span>int_step_inline</span><span>:nn</span> <span>{</span>8<span>}</span> <span>{</span> <span>node</span><span>[mynode]</span> at (<span>fp_eval</span><span>:n</span> <span>{</span>##1 * <span>l_w_dim</span><span>}</span> pt, -<span>fp_eval</span><span>:n</span> <span>{</span>#1 * <span>l_h_dim</span><span>}</span> pt) <span>{</span><span>tiny</span> <span>int_eval</span><span>:n</span> <span>{</span>(#1 - 1) * 8 + ##1<span>}}</span>; <span>}</span> <span>}</span> <span>end</span><span>{</span>tikzpicture<span>}</span> <span>ExplSyntaxOff</span> </pre> </div> <p>Output:</p> <p><img decoding="async" src="http://www.alanshawn.com/media/2020/latex3/number-grid-2.png"></img> </p> <h4 id="drawing-points-on-a-circle-and-connect-them-pairwise">Drawing points on a circle and connect them pairwise</h4> <div> <pre><span></span><span>ExplSyntaxOn</span> <span>begin</span><span>{</span>tikzpicture<span>}</span> <span>% draw points on the circle</span> <span>int_step_inline</span><span>:nn</span> <span>{</span>10<span>}</span> <span>{</span> <span>node</span>[fill=black, circle, inner~sep=0pt, outer~sep=0pt, minimum~width=1mm] (n#1) at ( <span>fp_eval</span><span>:n</span> <span>{</span>cos(#1 * 36 * <span>c_one_degree_fp</span>)<span>}</span> cm, <span>fp_eval</span><span>:n</span> <span>{</span>sin(#1 * 36 * <span>c_one_degree_fp</span>)<span>}</span> cm ) <span>{}</span>; <span>}</span> <span>% connect points pairwise</span> <span>int_step_inline</span><span>:nn</span> <span>{</span>10<span>}</span> <span>{</span> <span>int_step_inline</span><span>:nn</span> <span>{</span>10<span>}</span> <span>{</span> <span>draw</span> (n#1)--(n##1); <span>}</span> <span>}</span> <span>end</span><span>{</span>tikzpicture<span>}</span> <span>ExplSyntaxOff</span> </pre> </div> <p>Output:</p> <p><img decoding="async" src="http://www.alanshawn.com/media/2020/latex3/circle-points-connect.png"></img> </p> <h2 id="latex3-data-structure">LaTeX3: Data Structure</h2> <h3 id="queue-x-xv">Queue (X, XV)</h3> <p>Queues are essential in the implementation of many algorithms. Hence, <img decoding="async" alt="LaTeX3" src="http://www.alanshawn.com/media/2020/latex3/latex3.svg"></img> provides its queue implementation: <code>l3seq</code>.</p> <div> <pre><span></span><span>ExplSyntaxOn</span> <span>% create new queue</span> <span>seq_new</span><span>:N</span> <span>l_my_seq</span> <span>% empty queue</span> <span>seq_clear</span><span>:N</span> <span>l_my_seq</span> <span>% push right into queue</span> <span>seq_put_right</span><span>:Nn</span> <span>l_my_seq</span> <span>{</span>hello<span>}</span> <span>seq_put_right</span><span>:Nn</span> <span>l_my_seq</span> <span>{</span>world<span>}</span> <span>% join elements with '-' and output the result</span> <span>seq_use</span><span>:Nn</span> <span>l_my_seq</span> <span>{</span>-<span>}</span> <span>% hello-world</span> <span>% get the length of queue</span> <span>seq_count</span><span>:N</span> <span>l_my_seq</span> <span>% 2</span> <span>% pop the rightmost item and store it in l_tmpa_tl</span> <span>seq_pop_right</span><span>:NN</span> <span>l_my_seq</span> <span>l_tmpa_tl</span> <span>% get the 1st item in the queue</span> <span>seq_item</span><span>:Nn</span> <span>l_my_seq</span> <span>{</span>1<span>}</span> <span>% traverse items in queue</span> <span>% similar functions include seq_map_inline:</span> <span>% and seq_map_function:</span> <span>seq_map_inline</span><span>:Nn</span> <span>l_my_seq</span> <span>{</span> #1 <span>}</span> <span>ExplSyntaxOff</span> </pre> </div> <p>We call the <code>l3seq</code> container “queue” or “sequence” instead of “array” or “list”. One of the reasons for this is that index access is <em>read only</em>: one can only access item with <code><span>seq_item</span><span>:Nn</span></code>, but it is still impossible to modify an item based on index. However, if one wants to create a sequence of integer or floating point numbers, it is possible to take advantage of <code>l3intarray</code> or <code>l3fparray</code>, which allows index-based assignment. As it will be discussed later, they possess some other desirable qualities.</p> <h4 id="student-management-system-2">Student management system</h4> <div> <pre><span></span><span>ExplSyntaxOn</span> <span>% a queue that stores student names</span> <span>seq_new</span><span>:N</span> <span>l_student_seq</span> <span>newcommand</span><span>{</span><span>student</span><span>}</span>[1]<span>{</span> #1<span>% outputs student name</span> <span>% push student name to the right</span> <span>seq_put_right</span><span>:Nn</span> <span>l_student_seq</span> <span>{</span>#1<span>}</span> <span>}</span> <span>newcommand</span><span>{</span><span>allstudent</span><span>}{</span> <span>% join elements in the queue with comma</span> <span>% and then output the result</span> <span>seq_use</span><span>:Nn</span> <span>l_student_seq</span> <span>{</span>,~<span>}</span> <span>}</span> <span>newcommand</span><span>{</span><span>thestudent</span><span>}</span>[1]<span>{</span> <span>% outputs the #1-th element in the queue</span> <span>seq_item</span><span>:Nn</span> <span>l_student_seq</span> <span>{</span>#1<span>}</span> <span>}</span> <span>ExplSyntaxOff</span> <span>% John and Lisa and David and Emily</span> <span>student</span><span>{</span>John<span>}</span> and <span>student</span><span>{</span>Lisa<span>}</span> and <span>student</span><span>{</span>David<span>}</span> and <span>student</span><span>{</span>Emily<span>}</span> <span>% John, Lisa, David, Emily</span> <span>parallstudent</span> <span>% Emily and David and Lisa and John</span> <span>parthestudent</span><span>{</span>4<span>}</span> and <span>thestudent</span><span>{</span>3<span>}</span> and <span>thestudent</span><span>{</span>2<span>}</span> and <span>thestudent</span><span>{</span>1<span>}</span> </pre> </div> <h4 id="bracket-matching">Bracket matching</h4> <div> <pre><span></span><span>ExplSyntaxOn</span> <span>cs_set</span><span>:Npn</span> <span>my_paren_match</span><span>:n</span> #1 <span>{</span> <span>% convert #1 into string</span> <span>str_set</span><span>:Nn</span> <span>l_tmpa_str</span> <span>{</span>#1<span>}</span> <span>% clear working queue</span> <span>seq_clear</span><span>:N</span> <span>l_tmpa_seq</span> <span>% boolean variable to be set true if parentheses does not match</span> <span>bool_set_false</span><span>:N</span> <span>l_tmpa_bool</span> <span>str_map_inline</span><span>:Nn</span> <span>l_tmpa_str</span> <span>{</span> <span>% str_case:nn is like the "switch" statement in C</span> <span>str_case</span><span>:nn</span> <span>{</span>##1<span>}</span> <span>{</span> <span>% ------</span> <span>% for left brackets, simply push them into the queue</span> <span>{</span>(<span>}</span> <span>{</span> <span>seq_put_right</span><span>:Nn</span> <span>l_tmpa_seq</span> <span>{</span>(<span>}</span> <span>}</span> <span>{</span>[<span>}</span> <span>{</span> <span>seq_put_right</span><span>:Nn</span> <span>l_tmpa_seq</span> <span>{</span>[<span>}</span> <span>}</span> <span>% ------</span> <span>% ------</span> <span>% more work needs to be done for right brackets</span> <span>{</span>)<span>}</span> <span>{</span> <span>% pop the rightmost element and store it in l_tmpb_str</span> <span>seq_pop_right</span><span>:NN</span> <span>l_tmpa_seq</span> <span>l_tmpb_str</span> <span>% compare it with left round bracket</span> <span>% notice that the first argument is passed by value</span> <span>str_if_eq</span><span>:VnF</span> <span>l_tmpb_str</span> <span>{</span>(<span>}</span> <span>{</span> <span>% this is executed only when equality does not hold</span> <span>% set "not match" to be true</span> <span>bool_set_true</span><span>:N</span> <span>l_tmpa_bool</span> <span>% exits current loop</span> <span>str_map_break</span><span>:</span> <span>}</span> <span>}</span> <span>{</span>]<span>}</span> <span>{</span> <span>seq_pop_right</span><span>:NN</span> <span>l_tmpa_seq</span> <span>l_tmpb_str</span> <span>str_if_eq</span><span>:VnF</span> <span>l_tmpb_str</span> <span>{</span>[<span>}</span> <span>{</span> <span>bool_set_true</span><span>:N</span> <span>l_tmpa_bool</span> <span>str_map_break</span><span>:</span> <span>}</span> <span>}</span> <span>% ------</span> <span>}</span> <span>}</span> <span>% see if "not match" is true</span> <span>bool_if</span><span>:NTF</span> <span>l_tmpa_bool</span> <span>{</span>Not~Match<span>}</span> <span>{</span> <span>% see if the working queue is empty</span> <span>seq_if_empty</span><span>:NTF</span> <span>l_tmpa_seq</span> <span>{</span>Match<span>}</span> <span>{</span>Not~Match<span>}</span> <span>}</span> <span>}</span> <span>parmy_paren_match</span><span>:n</span> <span>{</span>()()<span>}</span> <span>% Match</span> <span>parmy_paren_match</span><span>:n</span> <span>{</span>([content()])()[]<span>}</span> <span>% Match</span> <span>parmy_paren_match</span><span>:n</span> <span>{</span>([content())()[]<span>}</span> <span>% Not Match</span> <span>parmy_paren_match</span><span>:n</span> <span>{</span>([content()])()[<span>}</span> <span>% Not Match</span> <span>ExplSyntaxOff</span> </pre> </div> <p>A very similar data structure is <code>l3clist</code>, which stands for “comma-separated list”. Most functions provided by <code>l3clist</code> is same as <code>l3seq</code>, except that it provides a convenient constructor that allows one to initialize a sequence with comma-separated content. An example is given below.</p> <div> <pre><span></span><span>ExplSyntaxOn</span> <span>clist_new</span><span>:N</span> <span>l_my_clist</span> <span>clist_set</span><span>:Nn</span> <span>l_my_clist</span> <span>{</span>This,is,my,list,1,2,3<span>}</span> <span>clist_use</span><span>:Nn</span> <span>l_my_clist</span> <span>{</span>-<span>}</span> <span>%This-is-my-list-1-2-3</span> <span>ExplSyntaxOff</span> </pre> </div> <h3 id="dictionary-xvii">Dictionary (XVII)</h3> <p><img decoding="async" alt="LaTeX3" src="http://www.alanshawn.com/media/2020/latex3/latex3.svg"></img> also provides key-value access dictionary container: <code>l3prop</code>. It is similar to <code>dict</code> in Python or <code>map</code> in C++.</p> <div> <pre><span></span><span>ExplSyntaxOn</span> <span>% create new dictionary</span> <span>prop_new</span><span>:N</span> <span>l_my_prop</span> <span>% clear dictionary</span> <span>prop_clear</span><span>:N</span> <span>l_my_prop</span> <span>% add/update key-value pair</span> <span>prop_put</span><span>:Nnn</span> <span>l_my_prop</span> <span>{</span>key<span>}</span> <span>{</span>val<span>}</span> <span>% get value given key</span> <span>prop_item</span><span>:Nn</span> <span>l_my_prop</span> <span>{</span>key<span>}</span> <span>% val</span> <span>% get number of key-value pairs</span> <span>prop_count</span><span>:N</span> <span>l_my_prop</span> <span>%1</span> <span>% traverse key-value pairs</span> <span>% similar functions include prop_map_function:</span> <span>% and prop_map_tokens:</span> <span>prop_map_inline</span><span>:Nn</span> <span>l_my_prop</span> <span>{</span> (#1, #2) <span>}</span> <span>% delete key-value pair</span> <span>prop_remove</span><span>:Nn</span> <span>l_my_prop</span> <span>{</span>key<span>}</span> <span>ExplSyntaxOff</span> </pre> </div> <h4 id="arabic-numerals-to-english-0-99">Arabic numerals to English (0-99)</h4> <div> <pre><span></span><span>ExplSyntaxOn</span> <span>prop_new</span><span>:N</span> <span>l_english_prop</span> <span>prop_set_from_keyval</span><span>:Nn</span> <span>l_english_prop</span> <span>{</span> 0=zero, 1=one, 2=two, 3=three, 4=four, 5=five, 6=six, 7=seven, 8=eight, 9=nine, 10=ten, 11=eleven, 12=twelve, 13=thirteen, 15=fifteen, 18=eighteen, 20=twenty, 30=thirty, 40=forty, 50=fifty, 80=eighty <span>}</span> <span>% extra scratch variable</span> <span>tl_new</span><span>:N</span> <span>l_tmpc_tl</span> <span>cs_set</span><span>:Npn</span> <span>my_arabic_to_eng</span><span>:n</span> #1 <span>{</span> <span>str_set</span><span>:Nn</span> <span>l_tmpa_str</span> <span>{</span>#1<span>}</span> <span>prop_if_in</span><span>:NVTF</span> <span>l_english_prop</span> <span>l_tmpa_str</span> <span>{</span> <span>% if the number is in the dictionary, output it directly</span> <span>% this works for most numbers under 20</span> <span>exp_args</span><span>:NNV</span> <span>prop_item</span><span>:Nn</span> <span>l_english_prop</span> <span>l_tmpa_str</span> <span>}</span> <span>{</span> <span>int_compare</span><span>:nNnTF</span> <span>{</span>#1<span>}</span> < <span>{</span>20<span>}</span> <span>{</span> <span>% deal with teens</span> <span>exp_args</span><span>:NNx</span> <span>prop_item</span><span>:Nn</span> <span>l_english_prop</span> <span>{</span> <span>int_eval</span><span>:n</span> <span>{</span>#1 - 10<span>}</span> <span>}</span> teen <span>}</span> <span>{</span> <span>% deal with numbers between 20-99</span> <span>% acquire number in tens</span> <span>int_set</span><span>:Nn</span> <span>l_tmpa_int</span> <span>{</span> <span>int_div_truncate</span><span>:nn</span> <span>{</span>#1<span>}</span> <span>{</span>10<span>}</span> * 10 <span>}</span> <span>% acquire number in ones</span> <span>int_set</span><span>:Nn</span> <span>l_tmpb_int</span> <span>{</span> #1 - <span>l_tmpa_int</span> <span>}</span> <span>% #1 = l_tmpa_int + l_tmpb_int</span> <span>tl_set</span><span>:Nx</span> <span>l_tmpa_tl</span> <span>{</span><span>int_use</span><span>:N</span> <span>l_tmpa_int</span><span>}</span> <span>% outputs the "-ty" word</span> <span>prop_if_in</span><span>:NVTF</span> <span>l_english_prop</span> <span>l_tmpa_tl</span> <span>{</span> <span>% no need to construct: get from dict directly</span> <span>exp_args</span><span>:NNV</span> <span>prop_item</span><span>:Nn</span> <span>l_english_prop</span> <span>l_tmpa_tl</span> <span>}</span> <span>{</span> <span>% need to construct the "-ty" word</span> <span>tl_set</span><span>:Nx</span> <span>l_tmpc_tl</span> <span>{</span><span>tl_head</span><span>:N</span> <span>l_tmpa_tl</span><span>}</span> <span>exp_args</span><span>:NNV</span> <span>prop_item</span><span>:Nn</span> <span>l_english_prop</span> <span>l_tmpc_tl</span> ty <span>}</span> <span>% no need to output second digit if it is zero</span> <span>int_compare</span><span>:nNnF</span> <span>{</span><span>l_tmpb_int</span><span>}</span> = <span>{</span>0<span>}</span> <span>{</span> <span>% otherwise, show second digit</span> <span>space</span> <span>tl_set</span><span>:Nx</span> <span>l_tmpb_tl</span> <span>{</span><span>int_use</span><span>:N</span> <span>l_tmpb_int</span><span>}</span> <span>exp_args</span><span>:NNV</span> <span>prop_item</span><span>:Nn</span> <span>l_english_prop</span> <span>l_tmpb_tl</span> <span>}</span> <span>}</span> <span>}</span> <span>}</span> <span>parmy_arabic_to_eng</span><span>:n</span> <span>{</span>0<span>}</span> <span>% zero</span> <span>parmy_arabic_to_eng</span><span>:n</span> <span>{</span>18<span>}</span> <span>% eighteen</span> <span>parmy_arabic_to_eng</span><span>:n</span> <span>{</span>53<span>}</span> <span>% fifty three</span> <span>parmy_arabic_to_eng</span><span>:n</span> <span>{</span>85<span>}</span> <span>% eighty five</span> <span>ExplSyntaxOff</span> </pre> </div> <div> <p>A number of <img decoding="async" alt="LaTeX3" src="http://www.alanshawn.com/media/2020/latex3/latex3.svg"></img> containers provide item-based access methods. For example, <code><span>tl_item</span><span>:Nn</span></code>, <code><span>seq_item</span><span>:Nn</span></code>, <code><span>prop_item</span><span>:Nn</span></code>, etc. Unlike in most programming languages, where the complexity of these methods are constant time (or in some cases, logarithmic time), these methods takes <strong>linear time</strong> in <img decoding="async" alt="LaTeX3" src="http://www.alanshawn.com/media/2020/latex3/latex3.svg"></img>. That is to say, the larger the container is, the longer the average access time will be.</p> <p>Fundamentally, <img decoding="async" alt="LaTeX" src="http://www.alanshawn.com/media/2020/latex3/latex.svg"></img> is a text-based macro language. There is no easy way for <img decoding="async" alt="LaTeX" src="http://www.alanshawn.com/media/2020/latex3/latex.svg"></img> scripts to access a computer’s memory space directly. As a result, all containers are essentially constructed with text and requires further interpretation when use. This implies that most <img decoding="async" alt="LaTeX3" src="http://www.alanshawn.com/media/2020/latex3/latex3.svg"></img> containers have extremely high time and memory consumption.</p> <p>If one wants to store an array of integer or floating point number in <img decoding="async" alt="LaTeX3" src="http://www.alanshawn.com/media/2020/latex3/latex3.svg"></img>, there are two types of high performance containers that allow constant time access, namely <code>l3intarray</code> and <code>l3fparray</code>. In <a href="https://www.alanshawn.com/leetcode/2020/06/05/leetcode-344-latex.html">this article</a>, I discussed how to use <code>l3intarray</code> to speed up string reversal.</p> </div> <h2 id="latex3-regular-expression-xxviii">LaTeX3: Regular Expression (XXVIII)</h2> <p><a href="https://en.wikipedia.org/wiki/Regular_expression">Regular expression</a> is a powerful tool for pattern matching in text documents. In <img decoding="async" alt="LaTeX3" src="http://www.alanshawn.com/media/2020/latex3/latex3.svg"></img>, the <code>l3regex</code> module provides limited support for standard regular expression syntax. These are some of the frequently used functions in <code>l3regex</code>:</p> <ul> <li><code><span>regex_new</span><span>:N</span></code>: creates new regular expression variable</li> <li><code><span>regex_set</span><span>:Nn</span></code>: set the content of a regular expression variable</li> <li>All of the following functions take either a raw regular expression or regular expression variable as the first argument. Raw regular expressions surrounded by braces requires compilation before use. The <code><span>regex_set</span><span>:Nn</span></code> function will apply both compilation and storage. Therefore, for a regular exression used multiple times, saving it in a variable may save some time.</li> <li><code><span>regex_match</span><span>:nnTF</span></code>: match a string based on the regular expression and execute <code>T</code>/<code>F</code> code based on the outcome</li> <li><code><span>regex_count</span><span>:nnN</span></code>: count the number of matches and store the result in an integer variable</li> <li><code><span>regex_extract_once</span><span>:nnN</span></code>: extract the first match in the string and store it in a token list variable</li> <li><code><span>regex_extract_all</span><span>:nnN</span></code>: extract all matches in the string and store them in a queue</li> <li><code><span>regex_split</span><span>:nnN</span></code>: split the string based on the regular expression and saved the result in a queue</li> <li><code><span>regex_replace_once</span><span>:nnN</span></code>: replace the first match</li> <li><code><span>regex_replace_all</span><span>:nnN</span></code>:replace all matches</li> </ul> <p>To allow interaction with <img decoding="async" alt="LaTeX" src="http://www.alanshawn.com/media/2020/latex3/latex.svg"></img>, the syntax of <code>l3regex</code> is slightly different from the standard. For more details, please see <img decoding="async" alt="LaTeX3" src="http://www.alanshawn.com/media/2020/latex3/latex3.svg"></img> documentation.</p> <h3 id="check-if-a-character-is-chinese">Check if a character is Chinese</h3> <div> <pre><span></span><span>ExplSyntaxOn</span> <span>% create and compile regex</span> <span>regex_new</span><span>:N</span> <span>l_chn_regex</span> <span>% the regular expression for Chinese characters</span> <span>regex_set</span><span>:Nn</span> <span>l_chn_regex</span> <span>{</span>[<span>x</span><span>{</span>3400<span>}</span>-<span>x</span><span>{</span>9FBF<span>}</span>]<span>}</span> <span>cs_set</span><span>:Npn</span> <span>my_is_chn</span><span>:n</span> #1 <span>{</span> <span>% store #1 as string</span> <span>str_set</span><span>:Nn</span> <span>l_tmpa_str</span> <span>{</span>#1<span>}</span> <span>% clear result queue</span> <span>seq_clear</span><span>:N</span> <span>l_tmpa_seq</span> <span>% traverse the string</span> <span>str_map_inline</span><span>:Nn</span> <span>l_tmpa_str</span> <span>{</span> <span>% check if the string matches l_chn_regex</span> <span>regex_match</span><span>:NnTF</span> <span>l_chn_regex</span> <span>{</span>##1<span>}</span> <span>{</span> <span>% if so, output Y</span> <span>seq_put_right</span><span>:Nn</span> <span>l_tmpa_seq</span> <span>{</span>Y<span>}</span> <span>}</span> <span>{</span> <span>% otherwise, output N</span> <span>seq_put_right</span><span>:Nn</span> <span>l_tmpa_seq</span> <span>{</span>N<span>}</span> <span>}</span> <span>}</span> <span>% show all contents in the queue, separated by white space</span> <span>seq_use</span><span>:Nn</span> <span>l_tmpa_seq</span> <span>{</span><span>space</span><span>}</span> <span>}</span> <span>% Y N Y N</span> <span>parmy_is_chn</span><span>:n</span> <span>{</span>中a文b<span>}</span> <span>% N N N N N N N Y Y Y</span> <span>parmy_is_chn</span><span>:n</span> <span>{</span>바탕체ヒラギノ細明體<span>}</span> <span>ExplSyntaxOff</span> </pre> </div> <h3 id="substitute-a-command-with-another">Substitute a command with another</h3> <p>In the following example, all occurrence of <code><span>cmda</span></code> is replaced by <code><span>cmdb</span></code>. This example makes use of <code>l3regex</code>’s special syntax.</p> <div> <pre><span></span><span>newcommand</span><span>{</span><span>cmda</span><span>}</span>[1]<span>{</span>(#1)<span>}</span> <span>newcommand</span><span>{</span><span>cmdb</span><span>}</span>[1]<span>{</span>[#1]<span>}</span> <span>ExplSyntaxOn</span> <span>tl_set</span><span>:Nn</span> <span>l_tmpa_tl</span> <span>{</span><span>cmda</span><span>{</span>X<span>}</span>~<span>cmdb</span><span>{</span>Y<span>}}</span> <span>partl_use</span><span>:N</span> <span>l_tmpa_tl</span> <span>% (X) [Y]</span> <span>% c will capture command names</span> <span>regex_replace_all</span><span>:nnN</span> <span>{</span><span>c</span><span>{</span>cmda<span>}}</span> <span>{</span><span>c</span><span>{</span>cmdb<span>}}</span> <span>l_tmpa_tl</span> <span>par</span> <span>tl_use</span><span>:N</span> <span>l_tmpa_tl</span> <span>% [X] [Y]</span> <span>ExplSyntaxOff</span> </pre> </div> <h3 id="generate-tikz-picture-based-on-a-template">Generate TikZ picture based on a template</h3> <div> <pre><span></span><span>tikzset</span><span>{</span> mynode/.style=<span>{</span> outer sep=0pt <span>}</span> <span>}</span> <span>ExplSyntaxOn</span> <span>% this is the template of each node</span> <span>% which we will fill with regular expressions</span> <span>tl_new</span><span>:N</span> <span>l_template_tl</span> <span>tl_set</span><span>:Nn</span> <span>l_template_tl</span> <span>{</span> <span>node</span><span>[mynode,@1]</span> (@2) at (@3) <span>{</span>@4<span>}</span>; <span>}</span> <span>% counts the total number of nodes</span> <span>int_new</span><span>:N</span> <span>l_node_counter_int</span> <span>int_gset</span><span>:Nn</span> <span>l_node_counter_int</span> <span>{</span>0<span>}</span> <span>% #1: style</span> <span>% #2: angle</span> <span>% #3: content</span> <span>cs_set</span><span>:Npn</span> <span>my_draw_node</span><span>:nnn</span> #1#2#3 <span>{</span> <span>% set our working variable</span> <span>tl_set_eq</span><span>:NN</span> <span>l_tmpa_tl</span> <span>l_template_tl</span> <span>% fill style</span> <span>regex_replace_once</span><span>:nnN</span> <span>{</span>@1<span>}</span> <span>{</span>#1<span>}</span> <span>l_tmpa_tl</span> <span>% increment counter</span> <span>int_gincr</span><span>:N</span> <span>l_node_counter_int</span> <span>% store the name of new node in l_tmpb_tl</span> <span>% node name is generated with int_to_alph:n</span> <span>tl_set</span><span>:Nx</span> <span>l_tmpb_tl</span> <span>{</span><span>int_to_alph</span><span>:n</span> <span>{</span><span>l_node_counter_int</span><span>}}</span> <span>% fill node name</span> <span>% use u to replace with the content of a token list</span> <span>regex_replace_once</span><span>:nnN</span> <span>{</span>@2<span>}</span> <span>{</span><span>u</span><span>{</span>l<span>_</span>tmpb<span>_</span>tl<span>}}</span> <span>l_tmpa_tl</span> <span>% calculate the position of the node based on angle</span> <span>tl_set</span><span>:Nx</span> <span>l_tmpb_tl</span> <span>{</span> <span>fp_eval</span><span>:n</span> <span>{</span>3 * cos(#2 * <span>c_one_degree_fp</span>)<span>}</span>, <span>fp_eval</span><span>:n</span> <span>{</span>3 * sin(#2 * <span>c_one_degree_fp</span>)<span>}</span> <span>}</span> <span>% fill position</span> <span>regex_replace_once</span><span>:nnN</span> <span>{</span>@3<span>}</span> <span>{</span><span>u</span><span>{</span>l<span>_</span>tmpb<span>_</span>tl<span>}}</span> <span>l_tmpa_tl</span> <span>% fill content</span> <span>regex_replace_once</span><span>:nnN</span> <span>{</span>@4<span>}</span> <span>{</span>#3<span>}</span> <span>l_tmpa_tl</span> <span>% output result</span> <span>tl_use</span><span>:N</span> <span>l_tmpa_tl</span> <span>}</span> <span>begin</span><span>{</span>tikzpicture<span>}</span> <span>my_draw_node</span><span>:nnn</span> <span>{</span>circle,draw<span>}{</span>200<span>}{</span>L<span>}</span> <span>my_draw_node</span><span>:nnn</span> <span>{</span>draw<span>}{</span>160<span>}{</span>A<span>}</span> <span>my_draw_node</span><span>:nnn</span> <span>{</span>circle,draw<span>}{</span>120<span>}{</span>T<span>}</span> <span>my_draw_node</span><span>:nnn</span> <span>{</span>draw<span>}{</span>80<span>}{</span>E<span>}</span> <span>my_draw_node</span><span>:nnn</span> <span>{</span>circle,draw<span>}{</span>40<span>}{</span>X<span>}</span> <span>my_draw_node</span><span>:nnn</span> <span>{</span>draw<span>}{</span>0<span>}{</span>3<span>}</span> <span>draw</span> (a)--(b)--(c)--(d)--(e)--(f)--(a); <span>end</span><span>{</span>tikzpicture<span>}</span> <span>ExplSyntaxOff</span> </pre> </div> <p>Output:</p> <p><img decoding="async" src="http://www.alanshawn.com/media/2020/latex3/tikz-template-graph.png"></img> </p> <h3 id="processing-multi-line-text">Processing multi-line text</h3> <p>We can use regular expressions and the <code>xparse</code> package to process multi-line text.<br /> In this example, we try to implement a code listing command with line numbering.<br /> If we use <code>+v</code> argument specification in <code><span>NewDocumentCommand</span></code>, the argument will be captured as multi-line verbatim.<br /> Once the argument is captured as <code>#1</code>, we use <code><span>regex_split</span><span>:nnN</span> <span>{</span><span>^</span><span>^</span>M<span>}</span> <span>{</span>#1<span>}</span> <span>l_tmpa_seq</span></code> to split it into multiple lines and save each line in <code><span>l_tmpa_seq</span></code>.<br /> The <code><span>^</span><span>^</span>M</code> notation means the carridge return character (ASCII code 13); more details about the <code>^^</code> notation can be found in this <a href="https://tex.stackexchange.com/questions/62725/the-notation-in-various-engines">link</a>.</p> <div> <pre><span></span><span>ExplSyntaxOn</span> <span>NewDocumentCommand</span><span>{</span><span>numberedtext</span><span>}{</span>+v<span>}{</span> <span>regex_split</span><span>:nnN</span> <span>{</span><span>^</span><span>^</span>M<span>}</span> <span>{</span>#1<span>}</span> <span>l_tmpa_seq</span> <span>% split into lines</span> <span>int_set</span><span>:Nn</span> <span>l_tmpa_int</span> <span>{</span>1<span>}</span> <span>% line number variable</span> <span>seq_map_inline</span><span>:Nn</span> <span>l_tmpa_seq</span> <span>{</span> <span>par</span> <span>group_begin</span><span>:</span> <span>% we want to limit ttfamily in this group</span> <span>int_use</span><span>:N</span> <span>l_tmpa_int</span> <span>ttfamily</span> <span> </span><span>% extra space between line number and content</span> <span>tl_to_str</span><span>:n</span> <span>{</span>##1<span>}</span> <span>% convert content into string</span> <span>group_end</span><span>:</span> <span>int_incr</span><span>:N</span> <span>l_tmpa_int</span> <span>% increment line number counter</span> <span>}</span> <span>}</span> <span>ExplSyntaxOff</span> <span>numberedtext</span><span>{</span><span>NewDocumentCommand</span><span>{</span><span>numberedtext</span><span>}{</span>+v<span>}{</span> <span>regex_split</span><span>:nnN</span> <span>{</span><span>^</span><span>^</span>M<span>}</span> <span>{</span>#1<span>}</span> <span>l_tmpa_seq</span> <span>int_set</span><span>:Nn</span> <span>l_tmpa_int</span> <span>{</span>1<span>}</span> <span>seq_map_inline</span><span>:Nn</span> <span>l_tmpa_seq</span> <span>{</span> <span>par</span> <span>group_begin</span><span>:</span> <span>int_use</span><span>:N</span> <span>l_tmpa_int</span> <span>ttfamily</span> <span> </span> <span>tl_to_str</span><span>:n</span> <span>{</span>##1<span>}</span> <span>group_end</span><span>:</span> <span>int_incr</span><span>:N</span> <span>l_tmpa_int</span> <span>}</span> <span>}}</span> </pre> </div> <p>Output:</p> <p><img decoding="async" src="http://www.alanshawn.com/media/2020/latex3/linenos.png"></img> </p> <h2 id="latex3-file-io-xix">LaTeX3: File I/O (XIX)</h2> <p>In <img decoding="async" alt="LaTeX3" src="http://www.alanshawn.com/media/2020/latex3/latex3.svg"></img>, the APIs of file operations are standardized.</p> <p>File reading:</p> <ul> <li><code><span>ior_new</span><span>:N</span></code>: create new I/O read variable</li> <li><code><span>ior_open</span><span>:Nn</span></code>: open file for reading</li> <li><code><span>ior_close</span><span>:N</span></code>: close file</li> <li><code><span>ior_get</span><span>:NN</span></code>: read one line or a complete group as token list</li> <li><code><span>ior_str_get</span><span>:NN</span></code>: read one line as string</li> <li><code><span>ior_map_inline</span><span>:Nn</span></code>: traverse file as token list</li> <li><code><span>ior_str_map_inline</span><span>:Nn</span></code>: traverse file as string</li> <li><code><span>ior_if_eof_p</span><span>:N</span></code>: check if the tail of a file is reached</li> </ul> <p>File writing:</p> <ul> <li><code><span>iow_new</span><span>:N</span></code>: create new I/O write variable</li> <li><code><span>iow_open</span><span>:Nn</span></code>: open file for writing</li> <li><code><span>iow_close</span><span>:N</span></code>: close file</li> <li><code><span>iow_now</span><span>:Nn</span></code>: immediately write content into the file, followed by a line break</li> <li><code><span>iow_newline</span><span>:</span></code>: line break function-this function must be expanded in order to take effect (e.g. <code><span>iow_now</span><span>:Nx</span> <span>l_tmpa_iow</span> <span>{</span><span>iow_newline</span><span>:</span><span>}</span></code>; if the second argument has type <code>n</code>, nothing will happen)</li> </ul> <h3 id="writing-to-a-file">Writing to a file</h3> <div> <pre><span></span><span>ExplSyntaxOn</span> <span>iow_open</span><span>:Nn</span> <span>g_tmpa_iow</span> <span>{</span>testfile1.txt<span>}</span> <span>iow_now</span><span>:Nx</span> <span>g_tmpa_iow</span> <span>{</span>hello<span>iow_newline</span><span>:</span> world<span>}</span> <span>iow_close</span><span>:N</span> <span>g_tmpa_iow</span> <span>ExplSyntaxOff</span> </pre> </div> <p>The content of <code>testfile1.txt</code>:</p> <h3 id="reading-and-parsing-comma-separated-file">Reading and parsing comma-separated file</h3> <p>In the following example, we store a series of decimal numbers in a comma-separated file. Then, we read the file and calculate the sum of all numbers.</p> <div> <pre><span></span><span>ExplSyntaxOn</span> <span>% write numbers to testfile2.txt</span> <span>iow_open</span><span>:Nn</span> <span>g_tmpa_iow</span> <span>{</span>testfile2.txt<span>}</span> <span>iow_now</span><span>:Nx</span> <span>g_tmpa_iow</span> <span>{</span>1.2,2.6,3.7,4.9,5.0,6.5,7.4,8.2,9.4,10.8<span>}</span> <span>iow_close</span><span>:N</span> <span>g_tmpa_iow</span> <span>% open file for reading</span> <span>ior_open</span><span>:Nn</span> <span>g_tmpa_ior</span> <span>{</span>testfile2.txt<span>}</span> <span>% get the first line</span> <span>ior_str_get</span><span>:NN</span> <span>g_tmpa_ior</span> <span>l_tmpa_str</span> <span>% create function variant</span> <span>cs_generate_variant</span><span>:Nn</span> <span>regex_split</span><span>:nnN</span> <span>{</span>nVN<span>}</span> <span>% split the line into a queue with regular expression</span> <span>regex_split</span><span>:nVN</span> <span>{</span>,<span>}</span> <span>l_tmpa_str</span> <span>l_tmpa_seq</span> <span>% initialize the sum variable</span> <span>fp_set</span><span>:Nn</span> <span>l_tmpa_fp</span> <span>{</span>0.0<span>}</span> <span>% traverse the queue</span> <span>seq_map_inline</span><span>:Nn</span> <span>l_tmpa_seq</span> <span>{</span> <span>% sum the numbers</span> <span>fp_add</span><span>:Nn</span> <span>l_tmpa_fp</span> <span>{</span>#1<span>}</span> <span>}</span> <span>% show result in math mode</span> <span>$</span><span>seq</span><span>_use:Nn </span><span>l</span><span>_tmpa_seq {</span><span>+</span><span>} </span><span>=</span><span> </span><span>fp</span><span>_use:N </span><span>l</span><span>_tmpa_fp</span><span>$</span> <span>% close file</span> <span>ior_close</span><span>:N</span> <span>g_tmpa_ior</span> <span>ExplSyntaxOff</span> </pre> </div> <p>Output:</p> <div> <div> <pre><code>1.2+2.6+3.7+4.9+5.0+6.5+7.4+8.2+9.4+10.8=59.7 </code></pre> </div> </div> <h2 id="memo">Memo</h2> <p>Useful techniques:</p> <p>Because the number of <img decoding="async" alt="LaTeX3" src="http://www.alanshawn.com/media/2020/latex3/latex3.svg"></img> modules is huge, it is very difficult to cover most of them in a limited amount of time. Here, I list some other libraries that are worth looking at:</p> <ul> <li><code>l3coffins</code> (XXX), <code>l3box</code> (XXIX): allows one to gauge the width/height of objects</li> <li><code>l3intarray</code> (XXII), <code>l3fparray</code> (XXIV): high performance numeric arrays</li> <li><code>l3sort</code>: sotring queues/token lists</li> <li><code>l3msg</code>: generating exception messages</li> </ul> <h2 id="end-note">End Note</h2> <p>In this article, I try to breifly introduce the naming convention, the usage of variables and functions and some commonly used modules of <img decoding="async" alt="LaTeX3" src="http://www.alanshawn.com/media/2020/latex3/latex3.svg"></img>. I hope that this organization enables readers to understand the basics of <img decoding="async" alt="LaTeX3" src="http://www.alanshawn.com/media/2020/latex3/latex3.svg"></img>, which allows them to write simple <img decoding="async" alt="LaTeX" src="http://www.alanshawn.com/media/2020/latex3/latex.svg"></img> programs quickly.</p> <p>There is no doubt that many documents can benefit from the programming capabilities of <img decoding="async" alt="LaTeX3" src="http://www.alanshawn.com/media/2020/latex3/latex3.svg"></img>. It is really pitiful that existing tutorials on <img decoding="async" alt="LaTeX3" src="http://www.alanshawn.com/media/2020/latex3/latex3.svg"></img> is rare, which significantly limits the development of this language. Hopefully, this article can help more people get familar with this powerful tool.</p> </div> <p><a href="https://www.alanshawn.com/latex3-tutorial/" class="button purchase" rel="nofollow noopener" target="_blank">Read More</a></p> </div></div><div class="wpb_wrapper td_block_separator td_block_wrap vc_separator tdi_119 td_separator_solid td_separator_center"><span style="border-color:#EBEBEB;border-width:1px;width:100%;"></span> <style scoped> /* custom css */ .td_block_separator{ width: 100%; align-items: center; margin-bottom: 38px; padding-bottom: 10px; }.td_block_separator span{ position: relative; display: block; margin: 0 auto; width: 100%; height: 1px; border-top: 1px solid #EBEBEB; }.td_separator_align_left span{ margin-left: 0; }.td_separator_align_right span{ margin-right: 0; }.td_separator_dashed span{ border-top-style: dashed; }.td_separator_dotted span{ border-top-style: dotted; }.td_separator_double span{ height: 3px; border-bottom: 1px solid #EBEBEB; }.td_separator_shadow > span{ position: relative; height: 20px; overflow: hidden; border: 0; color: #EBEBEB; }.td_separator_shadow > span > span{ position: absolute; top: -30px; left: 0; right: 0; margin: 0 auto; height: 13px; width: 98%; border-radius: 100%; }html :where([style*='border-width']){ border-style: none; } /* inline tdc_css att */ .tdi_119{ margin-top:28px !important; margin-bottom:20px !important; } </style></div><div class="td_block_wrap tdb_single_post_share tdi_120 td-pb-border-top td_block_template_1" data-td-block-uid="tdi_120" ><div id="tdi_120" class="td-post-sharing tdb-block td-ps-bg td-ps-notext td-post-sharing-style1 "><div class="td-post-sharing-visible"><div class="td-social-sharing-button td-social-sharing-button-js td-social-handler td-social-share-text"> <div class="td-social-but-icon"><i class="td-icon-share"></i></div> <div class="td-social-but-text">Share</div> </div><a class="td-social-sharing-button td-social-sharing-button-js td-social-network td-social-facebook" href="https://www.facebook.com/sharer.php?u=http%3A%2F%2Finstadsc.in%2Findex.php%2F2023%2F07%2F31%2Flatex3-programming-in-latex-with-ease-2020%2F" title="Facebook" ><div class="td-social-but-icon"><i class="td-icon-facebook"></i></div><div class="td-social-but-text">Facebook</div></a><a class="td-social-sharing-button td-social-sharing-button-js td-social-network td-social-twitter" href="https://twitter.com/intent/tweet?text=LaTeX3%3A+Programming+in+LaTeX+with+Ease+%282020%29&url=http%3A%2F%2Finstadsc.in%2Findex.php%2F2023%2F07%2F31%2Flatex3-programming-in-latex-with-ease-2020%2F&via=instadsc" title="Twitter" ><div class="td-social-but-icon"><i class="td-icon-twitter"></i></div><div class="td-social-but-text">Twitter</div></a><a class="td-social-sharing-button td-social-sharing-button-js td-social-network td-social-pinterest" href="https://pinterest.com/pin/create/button/?url=http://instadsc.in/index.php/2023/07/31/latex3-programming-in-latex-with-ease-2020/&media=http://instadsc.in/wp-content/uploads/2023/07/6953-latex3-programming-in-latex-with-ease-2020.svg&description=LaTeX3%3A+Programming+in+LaTeX+with+Ease+%282020%29" title="Pinterest" ><div class="td-social-but-icon"><i class="td-icon-pinterest"></i></div><div class="td-social-but-text">Pinterest</div></a><a class="td-social-sharing-button td-social-sharing-button-js td-social-network td-social-whatsapp" href="https://api.whatsapp.com/send?text=LaTeX3%3A+Programming+in+LaTeX+with+Ease+%282020%29 %0A%0A http://instadsc.in/index.php/2023/07/31/latex3-programming-in-latex-with-ease-2020/" title="WhatsApp" ><div class="td-social-but-icon"><i class="td-icon-whatsapp"></i></div><div class="td-social-but-text">WhatsApp</div></a></div><div class="td-social-sharing-hidden"><ul class="td-pulldown-filter-list"></ul><a class="td-social-sharing-button td-social-handler td-social-expand-tabs" href="#" data-block-uid="tdi_120" title="More"> <div class="td-social-but-icon"><i class="td-icon-plus td-social-expand-tabs-icon"></i></div> </a></div></div></div><div class="wpb_wrapper td_block_separator td_block_wrap vc_separator tdi_122 td_separator_solid td_separator_center"><span style="border-color:#EBEBEB;border-width:1px;width:100%;"></span> <style scoped> /* inline tdc_css att */ .tdi_122{ margin-bottom:30px !important; } /* phone */ @media (max-width: 767px) { .tdi_122{ margin-top:-7px !important; } } </style></div><div class="td_block_wrap tdb_single_next_prev tdi_123 td-animation-stack td-pb-border-top td_block_template_1" data-td-block-uid="tdi_123" > <style> /* inline tdc_css att */ .tdi_123{ margin-bottom:43px !important; } </style> <style> /* custom css */ .tdb_single_next_prev{ *zoom: 1; }.tdb_single_next_prev:before, .tdb_single_next_prev:after{ display: table; content: ''; line-height: 0; }.tdb_single_next_prev:after{ clear: both; }.tdb-next-post{ font-family: 'Roboto', sans-serif; width: 48%; float: left; transform: translateZ(0); -webkit-transform: translateZ(0); min-height: 1px; line-height: 1; }.tdb-next-post span{ display: block; font-size: 12px; color: #747474; margin-bottom: 7px; }.tdb-next-post a{ font-size: 15px; color: #222; line-height: 21px; -webkit-transition: color 0.2s ease; transition: color 0.2s ease; }.tdb-next-post a:hover{ color: #4db2ec; }.tdb-post-next{ margin-left: 2%; text-align: right; }.tdb-post-prev{ margin-right: 2%; }.tdb-post-next .td-image-container{ display: inline-block; }.tdi_123 .td-module-container{ display: flex; flex-direction: column; }.tdi_123 .tdb-post-next .td-module-container{ align-items: flex-end; }.tdi_123 .td-image-container{ display: block; order: 0; }.ie10 .tdi_123 .next-prev-title, .ie11 .tdi_123 .next-prev-title{ flex: auto; } /* landscape */ @media (min-width: 1019px) and (max-width: 1140px){ } /* portrait */ @media (min-width: 768px) and (max-width: 1018px){ } /* phone */ @media (max-width: 767px){ } </style><div class="tdb-block-inner td-fix-index"><div class="tdb-next-post tdb-next-post-bg tdb-post-prev"><span>Previous article</span><div class="td-module-container"><div class="next-prev-title"><a href="http://instadsc.in/index.php/2023/07/30/new-insights-into-the-origin-of-the-indo-european-languages/">New insights into the origin of the Indo-European languages</a></div></div></div><div class="tdb-next-post tdb-next-post-bg tdb-post-next"><span>Next article</span><div class="td-module-container"><div class="next-prev-title"><a href="http://instadsc.in/index.php/2023/07/31/the-matrix-calculus-you-need-for-deep-learning/">The Matrix Calculus You Need for Deep Learning</a></div></div></div></div></div><div class="tdb-author-box td_block_wrap tdb_single_author_box tdi_124 tdb-content-vert-top td-pb-border-top td_block_template_1" data-td-block-uid="tdi_124" > <style> /* inline tdc_css att */ /* phone */ @media (max-width: 767px) { .tdi_124{ justify-content:center !important; text-align:center !important; } } </style> <style> /* custom css */ .tdb-author-box .tdb-author-photo, .tdb-author-box .tdb-author-info{ display: table-cell; vertical-align: top; }.tdb-author-box .tdb-author-photo img{ display: block; }.tdb-author-box .tdb-author-counters span{ display: inline-block; background-color: #222; margin: 0 10px 0 0; padding: 5px 10px 4px; font-family: 'Roboto', sans-serif; font-size: 11px; font-weight: 700; line-height: 1; color: #fff; }.tdb-author-box .tdb-author-name, .tdb-author-box .tdb-author-url{ display: block; }.tdb-author-box .tdb-author-name{ margin: 7px 0 8px; font-family: 'Open Sans', 'Open Sans Regular', sans-serif; font-size: 15px; line-height: 21px; font-weight: 700; color: #222; }.tdb-author-box .tdb-author-name:hover{ color: #4db2ec; }.tdb-author-box .tdb-author-url{ margin-bottom: 6px; font-size: 11px; font-style: italic; line-height: 21px; color: #444; }.tdb-author-box .tdb-author-url:hover{ color: #4db2ec; }.tdb-author-box .tdb-author-descr{ font-size: 12px; }.tdb-author-box .tdb-author-social{ margin-top: 4px; }.tdb-author-box .tdb-social-item{ position: relative; display: inline-block; -webkit-transition: all 0.2s; transition: all 0.2s; text-align: center; -webkit-transform: translateZ(0); transform: translateZ(0); }.tdb-author-box .tdb-social-item:last-child{ margin-right: 0 !important; }.tdb-author-box .tdb-social-item i{ color: #000; -webkit-transition: all 0.2s; transition: all 0.2s; }.tdb-author-box .tdb-social-item:hover i{ color: #000; }.tdi_124{ padding: 21px; border: 1px solid #ededed; }.tdi_124 .tdb-author-info{ width: auto; padding-bottom: 0; padding-left: 21px; }.tdi_124 .tdb-author-photo{ width: 117px; transform: translateZ(0); -webkit-transform: translateZ(0); pointer-events: auto; }.tdi_124 .tdb-social-item i{ font-size: 15px; vertical-align: middle; line-height: 15px; }.tdi_124 .tdb-social-item i.td-icon-twitter, .tdi_124 .tdb-social-item i.td-icon-linkedin, .tdi_124 .tdb-social-item i.td-icon-pinterest, .tdi_124 .tdb-social-item i.td-icon-blogger, .tdi_124 .tdb-social-item i.td-icon-vimeo{ font-size: 12px; }.tdi_124 .tdb-social-item{ min-width: 15px; height: 15px; margin: 10px 20px 10px 0; }.tdi_124 .tdb-author-photo:hover:before{ opacity: 0; } /* landscape */ @media (min-width: 1019px) and (max-width: 1140px){ .tdi_124{ border: 1px solid #ededed; } } /* portrait */ @media (min-width: 768px) and (max-width: 1018px){ .tdi_124{ border: 1px solid #ededed; } } /* phone */ @media (max-width: 767px){ .tdi_124{ border: 1px solid #ededed; }.tdi_124 .tdb-author-photo{ display: inline-block; transform: translateZ(0); -webkit-transform: translateZ(0); }.tdi_124 .tdb-author-info{ display: inline-block; width: 100%; padding-top: 21px; padding-left: 0; } } </style><div class="tdb-block-inner td-fix-index"><a href="http://instadsc.in/index.php/author/admin/" class="tdb-author-photo" title="admin"><img alt='admin' src='http://0.gravatar.com/avatar/9acca5428068186492fbce6012789e5b?s=500&d=mm&r=g' srcset='http://0.gravatar.com/avatar/9acca5428068186492fbce6012789e5b?s=1000&d=mm&r=g 2x' class='avatar avatar-500 photo' height='500' width='500' loading='lazy' decoding='async'/></a><div class="tdb-author-info"><a href="http://instadsc.in/index.php/author/admin/" class="tdb-author-name">admin</a><a href="http://instadsc.in" class="tdb-author-url">http://instadsc.in</a><div class="tdb-author-descr"></div><div class="tdb-author-social"></div></div></div></div><div class="td_block_wrap td_flex_block_1 tdi_125 td_with_ajax_pagination td-pb-border-top td_block_template_1 td_flex_block" data-td-block-uid="tdi_125" > <style> /* custom css */ .tdi_125 .td-image-wrap{ padding-bottom: 70%; }.tdi_125 .entry-thumb{ background-position: center 50%; }.tdi_125 .td-module-container{ flex-direction: column; border-color: #eaeaea !important; }.tdi_125 .td-image-container{ display: block; order: 0; }.ie10 .tdi_125 .td-module-meta-info, .ie11 .tdi_125 .td-module-meta-info{ flex: auto; }.tdi_125 .td-module-meta-info{ border-color: #eaeaea; }.tdi_125 .td_module_wrap{ width: 33.33333333%; float: left; padding-left: 10px; padding-right: 10px; padding-bottom: 10px; margin-bottom: 10px; }.rtl .tdi_125 .td_module_wrap{ float: right; }.tdi_125 .td_block_inner{ margin-left: -10px; margin-right: -10px; }.tdi_125 .td-module-container:before{ bottom: -10px; border-color: #eaeaea; }.tdi_125 .td-post-vid-time{ display: block; }.tdi_125 .td-post-category:not(.td-post-extra-category){ display: inline-block; }.tdi_125 .td-author-photo .avatar{ width: 20px; height: 20px; margin-right: 6px; border-radius: 50%; }.tdi_125 .td-excerpt{ display: none; column-count: 1; column-gap: 48px; }.tdi_125 .td-audio-player{ opacity: 1; visibility: visible; height: auto; font-size: 13px; }.tdi_125 .td-read-more{ display: none; }.tdi_125 .td-author-date{ display: inline; }.tdi_125 .td-post-author-name{ display: none; }.tdi_125 .td-post-date, .tdi_125 .td-post-author-name span{ display: none; }.tdi_125 .entry-review-stars{ display: inline-block; }.tdi_125 .td-icon-star, .tdi_125 .td-icon-star-empty, .tdi_125 .td-icon-star-half{ font-size: 15px; }.tdi_125 .td-module-comments{ display: none; }.tdi_125 .td_module_wrap:nth-child(3n+1){ clear: both; }.tdi_125 .td_module_wrap:nth-last-child(-n+3){ margin-bottom: 0; padding-bottom: 0; }.tdi_125 .td_module_wrap:nth-last-child(-n+3) .td-module-container:before{ display: none; }.tdi_125 .td-module-exclusive .td-module-title a:before{ display: inline-block; }.tdi_125 .entry-title{ font-size:13px !important;line-height:1.4 !important;font-weight:500 !important; }html:not([class*='ie']) .tdi_125 .td-module-container:hover .entry-thumb:before{ opacity: 0; } /* landscape */ @media (min-width: 1019px) and (max-width: 1140px){ .tdi_125 .td_module_wrap{ padding-bottom: 10px; margin-bottom: 10px; clear: none !important; padding-bottom: 10px !important; margin-bottom: 10px !important; }.tdi_125 .td-module-container:before{ bottom: -10px; }.tdi_125 .td_module_wrap:nth-child(3n+1){ clear: both !important; }.tdi_125 .td_module_wrap:nth-last-child(-n+3){ margin-bottom: 0 !important; padding-bottom: 0 !important; }.tdi_125 .td_module_wrap .td-module-container:before{ display: block !important; }.tdi_125 .td_module_wrap:nth-last-child(-n+3) .td-module-container:before{ display: none !important; } } /* portrait */ @media (min-width: 768px) and (max-width: 1018px){ .tdi_125 .td_module_wrap{ padding-left: 7.5px; padding-right: 7.5px; padding-bottom: 7.5px; margin-bottom: 7.5px; clear: none !important; padding-bottom: 7.5px !important; margin-bottom: 7.5px !important; }.tdi_125 .td_block_inner{ margin-left: -7.5px; margin-right: -7.5px; }.tdi_125 .td-module-container:before{ bottom: -7.5px; }.tdi_125 .td-video-play-ico{ width: 24px; height: 24px; font-size: 24px; }.tdi_125 .td_module_wrap:nth-child(3n+1){ clear: both !important; }.tdi_125 .td_module_wrap:nth-last-child(-n+3){ margin-bottom: 0 !important; padding-bottom: 0 !important; }.tdi_125 .td_module_wrap .td-module-container:before{ display: block !important; }.tdi_125 .td_module_wrap:nth-last-child(-n+3) .td-module-container:before{ display: none !important; }.tdi_125 .entry-title{ font-size:12px !important;line-height:1.4 !important;font-weight:500 !important; } } /* phone */ @media (max-width: 767px){ .tdi_125 .td-image-container{ flex: 0 0 30%; width: 30%; display: block; order: 0; }.ie10 .tdi_125 .td-image-container, .ie11 .tdi_125 .td-image-container{ flex: 0 0 auto; }.tdi_125 .td-module-container{ flex-direction: row; }.ie10 .tdi_125 .td-module-meta-info, .ie11 .tdi_125 .td-module-meta-info{ flex: 1; }.tdi_125 .td-module-meta-info{ margin: 0 0 0 16px; padding: 0px; }.tdi_125 .td_module_wrap{ width: 100%; float: left; padding-left: 7.5px; padding-right: 7.5px; padding-bottom: 13px; margin-bottom: 13px; padding-bottom: 13px !important; margin-bottom: 13px !important; }.rtl .tdi_125 .td_module_wrap{ float: right; }.tdi_125 .td_block_inner{ margin-left: -7.5px; margin-right: -7.5px; }.tdi_125 .td-module-container:before{ bottom: -13px; }.tdi_125 .td-video-play-ico{ width: 24px; height: 24px; font-size: 24px; }.tdi_125 .td-post-date, .tdi_125 .td-post-author-name span{ display: inline-block; }.tdi_125 .td_module_wrap:nth-last-child(1){ margin-bottom: 0 !important; padding-bottom: 0 !important; }.tdi_125 .td_module_wrap .td-module-container:before{ display: block !important; }.tdi_125 .td_module_wrap:nth-last-child(1) .td-module-container:before{ display: none !important; }.tdi_125 .entry-title{ margin: 0 0 6px 0; font-size:14px !important;line-height:1.4 !important;font-weight:500 !important; } } </style><script>var block_tdi_125 = new tdBlock(); block_tdi_125.id = "tdi_125"; block_tdi_125.atts = '{"title_tag":"div","modules_on_row":"eyJhbGwiOiIzMy4zMzMzMzMzMyUiLCJwaG9uZSI6IjEwMCUifQ==","limit":"3","modules_category":"image","show_btn":"none","show_excerpt":"none","ajax_pagination":"next_prev","sort":"","category_id":"_related_cat","f_title_font_size":"eyJwaG9uZSI6IjE0IiwiYWxsIjoiMTMiLCJwb3J0cmFpdCI6IjEyIn0=","f_title_font_line_height":"eyJwaG9uZSI6IjEuNCIsImFsbCI6IjEuNCJ9","modules_gap":"eyJhbGwiOiIyMCIsInBvcnRyYWl0IjoiMTUiLCJwaG9uZSI6IjE1In0=","show_com":"none","show_date":"eyJhbGwiOiJub25lIiwicGhvbmUiOiJpbmxpbmUtYmxvY2sifQ==","show_author":"none","image_height":"70","f_title_font_weight":"500","all_modules_space":"eyJhbGwiOiIyMCIsImxhbmRzY2FwZSI6IjIwIiwicG9ydHJhaXQiOiIxNSIsInBob25lIjoiMjYifQ==","custom_title":"RELATED ARTICLES","image_floated":"eyJwaG9uZSI6ImZsb2F0X2xlZnQifQ==","image_width":"eyJwaG9uZSI6IjMwIn0=","meta_info_align":"","meta_margin":"eyJwaG9uZSI6IjAgMCAwIDE2cHgifQ==","meta_padding":"eyJwaG9uZSI6IjAifQ==","video_icon":"eyJwb3J0cmFpdCI6IjI0IiwicGhvbmUiOiIyNCJ9","image_size":"td_485x360","art_title":"eyJwaG9uZSI6IjAgMCA2cHggMCJ9","block_type":"td_flex_block_1","separator":"","custom_url":"","block_template_id":"","mc1_tl":"","mc1_title_tag":"","mc1_el":"","post_ids":"-6953","taxonomies":"","category_ids":"","in_all_terms":"","tag_slug":"","autors_id":"","installed_post_types":"","locked_only":"","offset":"","show_modified_date":"","time_ago":"","time_ago_add_txt":"ago","time_ago_txt_pos":"","el_class":"","td_ajax_filter_type":"","td_ajax_filter_ids":"","td_filter_default_txt":"All","td_ajax_preloading":"","container_width":"","m_padding":"","modules_border_size":"","modules_border_style":"","modules_border_color":"#eaeaea","modules_border_radius":"","modules_divider":"","modules_divider_color":"#eaeaea","h_effect":"","image_alignment":"50","image_radius":"","hide_image":"","video_popup":"yes","video_rec":"","spot_header":"","video_rec_title":"","video_rec_color":"","video_rec_disable":"","autoplay_vid":"yes","show_vid_t":"block","vid_t_margin":"","vid_t_padding":"","video_title_color":"","video_title_color_h":"","video_bg":"","video_overlay":"","vid_t_color":"","vid_t_bg_color":"","f_vid_title_font_header":"","f_vid_title_font_title":"Video pop-up article title","f_vid_title_font_settings":"","f_vid_title_font_family":"","f_vid_title_font_size":"","f_vid_title_font_line_height":"","f_vid_title_font_style":"","f_vid_title_font_weight":"","f_vid_title_font_transform":"","f_vid_title_font_spacing":"","f_vid_title_":"","f_vid_time_font_title":"Video duration text","f_vid_time_font_settings":"","f_vid_time_font_family":"","f_vid_time_font_size":"","f_vid_time_font_line_height":"","f_vid_time_font_style":"","f_vid_time_font_weight":"","f_vid_time_font_transform":"","f_vid_time_font_spacing":"","f_vid_time_":"","excl_show":"inline-block","excl_txt":"","excl_margin":"","excl_padd":"","all_excl_border":"","all_excl_border_style":"solid","excl_radius":"","excl_color":"","excl_color_h":"","excl_bg":"","excl_bg_h":"","all_excl_border_color":"","excl_border_color_h":"","f_excl_font_header":"","f_excl_font_title":"Label text","f_excl_font_settings":"","f_excl_font_family":"","f_excl_font_size":"","f_excl_font_line_height":"","f_excl_font_style":"","f_excl_font_weight":"","f_excl_font_transform":"","f_excl_font_spacing":"","f_excl_":"","meta_info_horiz":"layout-default","meta_width":"","meta_space":"","art_btn":"","meta_info_border_size":"","meta_info_border_style":"","meta_info_border_color":"#eaeaea","meta_info_border_radius":"","modules_category_margin":"","modules_category_padding":"","modules_cat_border":"","modules_category_radius":"0","show_cat":"inline-block","modules_extra_cat":"","author_photo":"","author_photo_size":"","author_photo_space":"","author_photo_radius":"","show_review":"inline-block","review_space":"","review_size":"2.5","review_distance":"","art_excerpt":"","excerpt_col":"1","excerpt_gap":"","excerpt_middle":"","excerpt_inline":"","show_audio":"block","hide_audio":"","art_audio":"","art_audio_size":"1.5","btn_title":"","btn_margin":"","btn_padding":"","btn_border_width":"","btn_radius":"","pag_space":"","pag_padding":"","pag_border_width":"","pag_border_radius":"","prev_tdicon":"","next_tdicon":"","pag_icons_size":"","f_header_font_header":"","f_header_font_title":"Block header","f_header_font_settings":"","f_header_font_family":"","f_header_font_size":"","f_header_font_line_height":"","f_header_font_style":"","f_header_font_weight":"","f_header_font_transform":"","f_header_font_spacing":"","f_header_":"","f_ajax_font_title":"Ajax categories","f_ajax_font_settings":"","f_ajax_font_family":"","f_ajax_font_size":"","f_ajax_font_line_height":"","f_ajax_font_style":"","f_ajax_font_weight":"","f_ajax_font_transform":"","f_ajax_font_spacing":"","f_ajax_":"","f_more_font_title":"Load more button","f_more_font_settings":"","f_more_font_family":"","f_more_font_size":"","f_more_font_line_height":"","f_more_font_style":"","f_more_font_weight":"","f_more_font_transform":"","f_more_font_spacing":"","f_more_":"","f_title_font_header":"","f_title_font_title":"Article title","f_title_font_settings":"","f_title_font_family":"","f_title_font_style":"","f_title_font_transform":"","f_title_font_spacing":"","f_title_":"","f_cat_font_title":"Article category tag","f_cat_font_settings":"","f_cat_font_family":"","f_cat_font_size":"","f_cat_font_line_height":"","f_cat_font_style":"","f_cat_font_weight":"","f_cat_font_transform":"","f_cat_font_spacing":"","f_cat_":"","f_meta_font_title":"Article meta info","f_meta_font_settings":"","f_meta_font_family":"","f_meta_font_size":"","f_meta_font_line_height":"","f_meta_font_style":"","f_meta_font_weight":"","f_meta_font_transform":"","f_meta_font_spacing":"","f_meta_":"","f_ex_font_title":"Article excerpt","f_ex_font_settings":"","f_ex_font_family":"","f_ex_font_size":"","f_ex_font_line_height":"","f_ex_font_style":"","f_ex_font_weight":"","f_ex_font_transform":"","f_ex_font_spacing":"","f_ex_":"","f_btn_font_title":"Article read more button","f_btn_font_settings":"","f_btn_font_family":"","f_btn_font_size":"","f_btn_font_line_height":"","f_btn_font_style":"","f_btn_font_weight":"","f_btn_font_transform":"","f_btn_font_spacing":"","f_btn_":"","mix_color":"","mix_type":"","fe_brightness":"1","fe_contrast":"1","fe_saturate":"1","mix_color_h":"","mix_type_h":"","fe_brightness_h":"1","fe_contrast_h":"1","fe_saturate_h":"1","m_bg":"","color_overlay":"","shadow_shadow_header":"","shadow_shadow_title":"Module Shadow","shadow_shadow_size":"","shadow_shadow_offset_horizontal":"","shadow_shadow_offset_vertical":"","shadow_shadow_spread":"","shadow_shadow_color":"","title_txt":"","title_txt_hover":"","all_underline_height":"","all_underline_color":"","cat_bg":"","cat_bg_hover":"","cat_txt":"","cat_txt_hover":"","cat_border":"","cat_border_hover":"","meta_bg":"","author_txt":"","author_txt_hover":"","date_txt":"","ex_txt":"","com_bg":"","com_txt":"","rev_txt":"","audio_btn_color":"","audio_time_color":"","audio_bar_color":"","audio_bar_curr_color":"","shadow_m_shadow_header":"","shadow_m_shadow_title":"Meta info shadow","shadow_m_shadow_size":"","shadow_m_shadow_offset_horizontal":"","shadow_m_shadow_offset_vertical":"","shadow_m_shadow_spread":"","shadow_m_shadow_color":"","btn_bg":"","btn_bg_hover":"","btn_txt":"","btn_txt_hover":"","btn_border":"","btn_border_hover":"","pag_text":"","pag_h_text":"","pag_bg":"","pag_h_bg":"","pag_border":"","pag_h_border":"","ajax_pagination_next_prev_swipe":"","ajax_pagination_infinite_stop":"","css":"","tdc_css":"","td_column_number":2,"header_color":"","color_preset":"","border_top":"","class":"tdi_125","tdc_css_class":"tdi_125","tdc_css_class_style":"tdi_125_rand_style","live_filter":"cur_post_same_categories","live_filter_cur_post_id":6953}'; block_tdi_125.td_column_number = "2"; block_tdi_125.block_type = "td_flex_block_1"; block_tdi_125.post_count = "3"; block_tdi_125.found_posts = "3200"; block_tdi_125.header_color = ""; block_tdi_125.ajax_pagination_infinite_stop = ""; block_tdi_125.max_num_pages = "1067"; tdBlocksArray.push(block_tdi_125); </script><div class="td-block-title-wrap"><div class="block-title td-block-title"><span class="td-pulldown-size">RELATED ARTICLES</span></div></div><div id=tdi_125 class="td_block_inner td-mc1-wrap"> <div class="td_module_flex td_module_flex_1 td_module_wrap td-animation-stack td-cpt-post"> <div class="td-module-container td-category-pos-image"> <div class="td-image-container"> <a href="http://instadsc.in/index.php/category/uncategorized/" class="td-post-category">Uncategorized</a> <div class="td-module-thumb"><a href="http://instadsc.in/index.php/2023/12/09/w4-games-raises-15m-to-drive-video-game-development-with-godot-engine/" rel="bookmark" class="td-image-wrap " title="W4 Games raises $15M to drive video game development with Godot Engine" ><span class="entry-thumb td-thumb-css" data-type="css_image" data-img-url="http://instadsc.in/wp-content/uploads/2023/12/9185-w4-games-raises-15m-to-drive-video-game-development-with-godot-engine-485x360.jpeg" ></span></a></div> </div> <div class="td-module-meta-info"> <h3 class="entry-title td-module-title"><a href="http://instadsc.in/index.php/2023/12/09/w4-games-raises-15m-to-drive-video-game-development-with-godot-engine/" rel="bookmark" title="W4 Games raises $15M to drive video game development with Godot Engine">W4 Games raises $15M to drive video game development with Godot Engine</a></h3> <div class="td-editor-date"> <span class="td-author-date"> <span class="td-post-date"><time class="entry-date updated td-module-date" datetime="2023-12-09T11:43:09+00:00" >December 9, 2023</time></span> </span> </div> </div> </div> </div> <div class="td_module_flex td_module_flex_1 td_module_wrap td-animation-stack td-cpt-post"> <div class="td-module-container td-category-pos-image"> <div class="td-image-container"> <a href="http://instadsc.in/index.php/category/uncategorized/" class="td-post-category">Uncategorized</a> <div class="td-module-thumb"><a href="http://instadsc.in/index.php/2023/12/09/apple-cuts-off-beeper-minis-access/" rel="bookmark" class="td-image-wrap " title="Apple cuts off Beeper Mini’s access" ><span class="entry-thumb td-thumb-css" data-type="css_image" data-img-url="http://instadsc.in/wp-content/uploads/2023/12/9187-apple-cuts-off-beeper-minis-access-485x360.jpg" ></span></a></div> </div> <div class="td-module-meta-info"> <h3 class="entry-title td-module-title"><a href="http://instadsc.in/index.php/2023/12/09/apple-cuts-off-beeper-minis-access/" rel="bookmark" title="Apple cuts off Beeper Mini’s access">Apple cuts off Beeper Mini’s access</a></h3> <div class="td-editor-date"> <span class="td-author-date"> <span class="td-post-date"><time class="entry-date updated td-module-date" datetime="2023-12-09T11:43:08+00:00" >December 9, 2023</time></span> </span> </div> </div> </div> </div> <div class="td_module_flex td_module_flex_1 td_module_wrap td-animation-stack td-cpt-post"> <div class="td-module-container td-category-pos-image"> <div class="td-image-container"> <a href="http://instadsc.in/index.php/category/uncategorized/" class="td-post-category">Uncategorized</a> <div class="td-module-thumb"><a href="http://instadsc.in/index.php/2023/12/09/openbao-foss-fork-of-hashicorp-vault/" rel="bookmark" class="td-image-wrap " title="OpenBao – FOSS Fork of HashiCorp Vault" ><span class="entry-thumb td-thumb-css" data-type="css_image" data-img-url="http://instadsc.in/wp-content/uploads/2023/12/9189-openbao-foss-fork-of-hashicorp-vault-485x360.jpg" ></span></a></div> </div> <div class="td-module-meta-info"> <h3 class="entry-title td-module-title"><a href="http://instadsc.in/index.php/2023/12/09/openbao-foss-fork-of-hashicorp-vault/" rel="bookmark" title="OpenBao – FOSS Fork of HashiCorp Vault">OpenBao – FOSS Fork of HashiCorp Vault</a></h3> <div class="td-editor-date"> <span class="td-author-date"> <span class="td-post-date"><time class="entry-date updated td-module-date" datetime="2023-12-09T11:43:07+00:00" >December 9, 2023</time></span> </span> </div> </div> </div> </div> </div><div class="td-next-prev-wrap"><a href="#" class="td-ajax-prev-page ajax-page-disabled" aria-label="prev-page" id="prev-page-tdi_125" data-td_block_id="tdi_125"><i class="td-next-prev-icon td-icon-font td-icon-menu-left"></i></a><a href="#" class="td-ajax-next-page" aria-label="next-page" id="next-page-tdi_125" data-td_block_id="tdi_125"><i class="td-next-prev-icon td-icon-font td-icon-menu-right"></i></a></div></div> <script> var tdb_login_sing_in_shortcode="on"; </script> <div class="td_block_wrap tdb_single_comments tdi_126 tdb-comm-layout1 td-pb-border-top td_block_template_1" data-td-block-uid="tdi_126" > <style> /* custom css */ .tdb_single_comments input[type=text]{ min-height: 34px; height: auto; }.tdb_single_comments .comments, .tdb_single_comments .comment-respond:last-child, .tdb_single_comments .form-submit{ margin-bottom: 0; }.is-visually-hidden{ border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; }.tdb-comm-layout3 form, .tdb-comm-layout5 form{ display: flex; flex-wrap: wrap; }.tdb-comm-layout3 .td-form-comment, .tdb-comm-layout5 .td-form-comment, .tdb-comm-layout3 .form-submit, .tdb-comm-layout5 .form-submit{ flex: 0 0 100%; order: 1; }.tdb-comm-layout3 .td-form-author, .tdb-comm-layout3 .td-form-email, .tdb-comm-layout3 .td-form-url{ flex: 0 0 32%; }.tdb-comm-layout5 .td-form-author, .tdb-comm-layout5 .td-form-email{ flex: 0 0 49%; }.tdb-comm-layout5 .td-form-url{ flex: 0 0 100%; }.tdb-comm-leave_reply_top .comments{ display: flex; flex-direction: column; }.tdb-comm-leave_reply_top .td-comments-title{ order: 0; margin-bottom: 14px; }.tdb-comm-leave_reply_top .comment-respond .form-submit{ order: 1; margin-bottom: 21px; }.tdb-comm-leave_reply_top .comment-list{ order: 2; }.tdb-comm-leave_reply_top .comment-pagination{ order: 3; }.tdi_126 .comment-link{ display: inline-block; }.tdi_126 .comment{ border-bottom-style: dashed; }.tdi_126 .comment .children{ border-top-style: dashed; }@media (min-width: 767px) { .tdb-comm-layout2 form, .tdb-comm-layout4 form { margin: 0 -10px; } .tdb-comm-layout2 .logged-in-as, .tdb-comm-layout4 .logged-in-as, .tdb-comm-layout2 .comment-form-input-wrap, .tdb-comm-layout4 .comment-form-input-wrap, .tdb-comm-layout2 .form-submit, .tdb-comm-layout4 .form-submit, .tdb-comm-layout2 .comment-respond p, .tdb-comm-layout4 .comment-respond p { padding: 0 10px; } .tdb-comm-layout2 .td-form-author, .tdb-comm-layout2 .td-form-email { float: left; width: 33.3333%; } .tdb-comm-layout2 .td-form-url { width: 33.3333%; } .tdb-comm-layout2 .td-form-url { float: left; } .tdb-comm-layout4 .td-form-author, .tdb-comm-layout4 .td-form-email { float: left; width: 50%; } .tdb-comm-layout3 .td-form-author, .tdb-comm-layout5 .td-form-author, .tdb-comm-layout3 .td-form-email { margin-right: 2%; } }@media (max-width: 767px) { .tdb-comm-layout3 .td-form-author, .tdb-comm-layout3 .td-form-email, .tdb-comm-layout3 .td-form-url, .tdb-comm-layout5 .td-form-author, .tdb-comm-layout5 .td-form-email { flex: 0 0 100%; } } </style><div class="tdb-block-inner td-fix-index"><div class="comments" id="comments"> <div id="respond" class="comment-respond"> <h3 id="reply-title" class="comment-reply-title">LEAVE A REPLY <small><a rel="nofollow" id="cancel-comment-reply-link" href="/index.php/2023/07/31/latex3-programming-in-latex-with-ease-2020/#respond" style="display:none;">Cancel reply</a></small></h3><form action="http://instadsc.in/wp-comments-post.php" method="post" id="commentform" class="comment-form" novalidate><div class="clearfix"></div> <div class="comment-form-input-wrap td-form-comment"> <textarea placeholder="Comment:" id="comment" name="comment" cols="45" rows="8" aria-required="true" ></textarea> <label for="comment" class="is-visually-hidden">Comment:</label> <div class="td-warning-comment">Please enter your comment!</div> </div><div class="comment-form-input-wrap td-form-author"> <input class="" id="author" name="author" placeholder="Name:*" type="text" value="" size="30" aria-required='true' /> <label for="author" class="is-visually-hidden">Name:*</label> <div class="td-warning-author">Please enter your name here</div> </div> <div class="comment-form-input-wrap td-form-email"> <input class="" id="email" name="email" placeholder="Email:*" type="text" value="" size="30" aria-required='true' /> <label for="email" class="is-visually-hidden">Email:*</label> <div class="td-warning-email-error">You have entered an incorrect email address!</div> <div class="td-warning-email">Please enter your email address here</div> </div> <div class="comment-form-input-wrap td-form-url"> <input class="" id="url" name="url" placeholder="Website:" type="text" value="" size="30" /> <label for="url" class="is-visually-hidden">Website:</label> </div> <p class="comment-form-cookies-consent"> <input id="wp-comment-cookies-consent" name="wp-comment-cookies-consent" type="checkbox" value="yes" /> <label for="wp-comment-cookies-consent">Save my name, email, and website in this browser for the next time I comment.</label> </p> <p class="form-submit"><input name="submit" type="submit" id="submit" class="submit" value="Post Comment" /> <input type='hidden' name='comment_post_ID' value='6953' id='comment_post_ID' /> <input type='hidden' name='comment_parent' id='comment_parent' value='0' /> </p><p style="display: none !important;"><label>Δ<textarea name="ak_hp_textarea" cols="45" rows="8" maxlength="100"></textarea></label><input type="hidden" id="ak_js_1" name="ak_js" value="47"/><script>document.getElementById( "ak_js_1" ).setAttribute( "value", ( new Date() ).getTime() );</script></p></form> </div><!-- #respond --> </div></div></div></div></div><div class="vc_column tdi_128 wpb_column vc_column_container tdc-column td-pb-span4 td-is-sticky"> <style scoped> /* custom css */ .tdi_128{ vertical-align: baseline; }.tdi_128 > .wpb_wrapper, .tdi_128 > .wpb_wrapper > .tdc-elements{ display: block; }.tdi_128 > .wpb_wrapper > .tdc-elements{ width: 100%; }.tdi_128 > .wpb_wrapper > .vc_row_inner{ width: auto; }.tdi_128 > .wpb_wrapper{ width: auto; height: auto; } </style><div class="wpb_wrapper"><div class="td-a-rec td-a-rec-id-sidebar tdi_129 td_block_template_1"> <style> /* inline tdc_css att */ .tdi_129{ margin-bottom:48px !important; } </style> <style> /* custom css */ .tdi_129.td-a-rec{ text-align: center; }.tdi_129 .td-element-style{ z-index: -1; } </style><span class="td-adspot-title">- Advertisment -</span><div class="td-all-devices"><a href="https://www.google.com"><img alt="Google search engine" src="http://instadsc.in/wp-content/uploads/2023/03/newspaper-rec300@2x.jpg" width="300" height="250"/></a></div></div><div class="td_block_wrap td_flex_block_1 tdi_130 td_with_ajax_pagination td-pb-border-top td_block_template_1 td_flex_block" data-td-block-uid="tdi_130" > <style> /* custom css */ .tdi_130 .td-image-wrap{ padding-bottom: 70%; }.tdi_130 .entry-thumb{ background-position: center 50%; }.tdi_130 .td-image-container{ flex: 0 0 30%; width: 30%; display: block; order: 0; }.ie10 .tdi_130 .td-image-container, .ie11 .tdi_130 .td-image-container{ flex: 0 0 auto; }.tdi_130 .td-module-container{ flex-direction: row; border-color: #eaeaea !important; }.ie10 .tdi_130 .td-module-meta-info, .ie11 .tdi_130 .td-module-meta-info{ flex: 1; }.tdi_130 .td-module-meta-info{ padding: 0 0 0 13px; border-color: #eaeaea; }.tdi_130 .td_module_wrap{ padding-left: 20px; padding-right: 20px; padding-bottom: 15px; margin-bottom: 15px; }.tdi_130 .td_block_inner{ margin-left: -20px; margin-right: -20px; }.tdi_130 .td-module-container:before{ bottom: -15px; border-color: #eaeaea; }.tdi_130 .td-post-vid-time{ display: block; }.tdi_130 .td-post-category:not(.td-post-extra-category){ display: none; }.tdi_130 .td-author-photo .avatar{ width: 20px; height: 20px; margin-right: 6px; border-radius: 50%; }.tdi_130 .td-excerpt{ display: none; column-count: 1; column-gap: 48px; }.tdi_130 .td-audio-player{ opacity: 1; visibility: visible; height: auto; font-size: 13px; }.tdi_130 .td-read-more{ display: none; }.tdi_130 .td-author-date{ display: inline; }.tdi_130 .td-post-author-name{ display: none; }.tdi_130 .entry-review-stars{ display: inline-block; }.tdi_130 .td-icon-star, .tdi_130 .td-icon-star-empty, .tdi_130 .td-icon-star-half{ font-size: 15px; }.tdi_130 .td-module-comments{ display: none; }.tdi_130 .td_module_wrap:nth-last-child(1){ margin-bottom: 0; padding-bottom: 0; }.tdi_130 .td_module_wrap:nth-last-child(1) .td-module-container:before{ display: none; }.tdi_130 .td-module-exclusive .td-module-title a:before{ display: inline-block; }.tdi_130 .td-block-title a, .tdi_130 .td-block-title span{ text-transform:uppercase !important; }.tdi_130 .entry-title{ font-size:14px !important;line-height:1.4 !important;font-weight:500 !important; }html:not([class*='ie']) .tdi_130 .td-module-container:hover .entry-thumb:before{ opacity: 0; } /* landscape */ @media (min-width: 1019px) and (max-width: 1140px){ .tdi_130 .td_module_wrap{ padding-bottom: 15px; margin-bottom: 15px; padding-bottom: 15px !important; margin-bottom: 15px !important; }.tdi_130 .td-module-container:before{ bottom: -15px; }.tdi_130 .td_module_wrap:nth-last-child(1){ margin-bottom: 0 !important; padding-bottom: 0 !important; }.tdi_130 .td_module_wrap .td-module-container:before{ display: block !important; }.tdi_130 .td_module_wrap:nth-last-child(1) .td-module-container:before{ display: none !important; } } /* portrait */ @media (min-width: 768px) and (max-width: 1018px){ .tdi_130 .td_module_wrap{ width: 100%; float: left; padding-left: 10px; padding-right: 10px; padding-bottom: 10px; margin-bottom: 10px; padding-bottom: 10px !important; margin-bottom: 10px !important; }.rtl .tdi_130 .td_module_wrap{ float: right; }.tdi_130 .td_block_inner{ margin-left: -10px; margin-right: -10px; }.tdi_130 .td-module-container:before{ bottom: -10px; }.tdi_130 .td-post-date, .tdi_130 .td-post-author-name span{ display: none; }.tdi_130 .td_module_wrap:nth-last-child(1){ margin-bottom: 0 !important; padding-bottom: 0 !important; }.tdi_130 .td_module_wrap .td-module-container:before{ display: block !important; }.tdi_130 .td_module_wrap:nth-last-child(1) .td-module-container:before{ display: none !important; }.tdi_130 .entry-title{ font-size:12px !important;line-height:1.4 !important;font-weight:500 !important; } } /* phone */ @media (max-width: 767px){ .tdi_130 .td-module-meta-info{ padding: 0 0 0 16px; }.tdi_130 .td_module_wrap{ width: 100%; float: left; padding-bottom: 15px; margin-bottom: 15px; padding-bottom: 15px !important; margin-bottom: 15px !important; }.rtl .tdi_130 .td_module_wrap{ float: right; }.tdi_130 .td-module-container:before{ bottom: -15px; }.tdi_130 .td_module_wrap:nth-last-child(1){ margin-bottom: 0 !important; padding-bottom: 0 !important; }.tdi_130 .td_module_wrap .td-module-container:before{ display: block !important; }.tdi_130 .td_module_wrap:nth-last-child(1) .td-module-container:before{ display: none !important; } } </style><script>var block_tdi_130 = new tdBlock(); block_tdi_130.id = "tdi_130"; block_tdi_130.atts = '{"modules_on_row":"eyJwb3J0cmFpdCI6IjEwMCUiLCJwaG9uZSI6IjEwMCUifQ==","image_size":"","image_floated":"float_left","image_width":"30","image_height":"70","show_btn":"none","show_excerpt":"none","show_com":"none","show_author":"none","show_cat":"none","limit":"4","meta_padding":"eyJhbGwiOiIwIDAgMCAxM3B4IiwicGhvbmUiOiIwIDAgMCAxNnB4In0=","f_title_font_size":"eyJhbGwiOiIxNCIsInBvcnRyYWl0IjoiMTIifQ==","f_title_font_line_height":"1.4","f_title_font_weight":"500","all_modules_space":"eyJhbGwiOiIzMCIsInBvcnRyYWl0IjoiMjAifQ==","category_id":"","modules_gap":"eyJwb3J0cmFpdCI6IjIwIn0=","show_date":"eyJwb3J0cmFpdCI6Im5vbmUifQ==","custom_title":"Most Popular","ajax_pagination":"load_more","sort":"","f_header_font_transform":"uppercase","block_type":"td_flex_block_1","separator":"","custom_url":"","block_template_id":"","title_tag":"","mc1_tl":"","mc1_title_tag":"","mc1_el":"","post_ids":"-6953","taxonomies":"","category_ids":"","in_all_terms":"","tag_slug":"","autors_id":"","installed_post_types":"","locked_only":"","offset":"","show_modified_date":"","time_ago":"","time_ago_add_txt":"ago","time_ago_txt_pos":"","el_class":"","td_ajax_filter_type":"","td_ajax_filter_ids":"","td_filter_default_txt":"All","td_ajax_preloading":"","container_width":"","m_padding":"","modules_border_size":"","modules_border_style":"","modules_border_color":"#eaeaea","modules_border_radius":"","modules_divider":"","modules_divider_color":"#eaeaea","h_effect":"","image_alignment":"50","image_radius":"","hide_image":"","video_icon":"","video_popup":"yes","video_rec":"","spot_header":"","video_rec_title":"","video_rec_color":"","video_rec_disable":"","autoplay_vid":"yes","show_vid_t":"block","vid_t_margin":"","vid_t_padding":"","video_title_color":"","video_title_color_h":"","video_bg":"","video_overlay":"","vid_t_color":"","vid_t_bg_color":"","f_vid_title_font_header":"","f_vid_title_font_title":"Video pop-up article title","f_vid_title_font_settings":"","f_vid_title_font_family":"","f_vid_title_font_size":"","f_vid_title_font_line_height":"","f_vid_title_font_style":"","f_vid_title_font_weight":"","f_vid_title_font_transform":"","f_vid_title_font_spacing":"","f_vid_title_":"","f_vid_time_font_title":"Video duration text","f_vid_time_font_settings":"","f_vid_time_font_family":"","f_vid_time_font_size":"","f_vid_time_font_line_height":"","f_vid_time_font_style":"","f_vid_time_font_weight":"","f_vid_time_font_transform":"","f_vid_time_font_spacing":"","f_vid_time_":"","excl_show":"inline-block","excl_txt":"","excl_margin":"","excl_padd":"","all_excl_border":"","all_excl_border_style":"solid","excl_radius":"","excl_color":"","excl_color_h":"","excl_bg":"","excl_bg_h":"","all_excl_border_color":"","excl_border_color_h":"","f_excl_font_header":"","f_excl_font_title":"Label text","f_excl_font_settings":"","f_excl_font_family":"","f_excl_font_size":"","f_excl_font_line_height":"","f_excl_font_style":"","f_excl_font_weight":"","f_excl_font_transform":"","f_excl_font_spacing":"","f_excl_":"","meta_info_align":"","meta_info_horiz":"layout-default","meta_width":"","meta_margin":"","meta_space":"","art_title":"","art_btn":"","meta_info_border_size":"","meta_info_border_style":"","meta_info_border_color":"#eaeaea","meta_info_border_radius":"","modules_category":"","modules_category_margin":"","modules_category_padding":"","modules_cat_border":"","modules_category_radius":"0","modules_extra_cat":"","author_photo":"","author_photo_size":"","author_photo_space":"","author_photo_radius":"","show_review":"inline-block","review_space":"","review_size":"2.5","review_distance":"","art_excerpt":"","excerpt_col":"1","excerpt_gap":"","excerpt_middle":"","excerpt_inline":"","show_audio":"block","hide_audio":"","art_audio":"","art_audio_size":"1.5","btn_title":"","btn_margin":"","btn_padding":"","btn_border_width":"","btn_radius":"","pag_space":"","pag_padding":"","pag_border_width":"","pag_border_radius":"","prev_tdicon":"","next_tdicon":"","pag_icons_size":"","f_header_font_header":"","f_header_font_title":"Block header","f_header_font_settings":"","f_header_font_family":"","f_header_font_size":"","f_header_font_line_height":"","f_header_font_style":"","f_header_font_weight":"","f_header_font_spacing":"","f_header_":"","f_ajax_font_title":"Ajax categories","f_ajax_font_settings":"","f_ajax_font_family":"","f_ajax_font_size":"","f_ajax_font_line_height":"","f_ajax_font_style":"","f_ajax_font_weight":"","f_ajax_font_transform":"","f_ajax_font_spacing":"","f_ajax_":"","f_more_font_title":"Load more button","f_more_font_settings":"","f_more_font_family":"","f_more_font_size":"","f_more_font_line_height":"","f_more_font_style":"","f_more_font_weight":"","f_more_font_transform":"","f_more_font_spacing":"","f_more_":"","f_title_font_header":"","f_title_font_title":"Article title","f_title_font_settings":"","f_title_font_family":"","f_title_font_style":"","f_title_font_transform":"","f_title_font_spacing":"","f_title_":"","f_cat_font_title":"Article category tag","f_cat_font_settings":"","f_cat_font_family":"","f_cat_font_size":"","f_cat_font_line_height":"","f_cat_font_style":"","f_cat_font_weight":"","f_cat_font_transform":"","f_cat_font_spacing":"","f_cat_":"","f_meta_font_title":"Article meta info","f_meta_font_settings":"","f_meta_font_family":"","f_meta_font_size":"","f_meta_font_line_height":"","f_meta_font_style":"","f_meta_font_weight":"","f_meta_font_transform":"","f_meta_font_spacing":"","f_meta_":"","f_ex_font_title":"Article excerpt","f_ex_font_settings":"","f_ex_font_family":"","f_ex_font_size":"","f_ex_font_line_height":"","f_ex_font_style":"","f_ex_font_weight":"","f_ex_font_transform":"","f_ex_font_spacing":"","f_ex_":"","f_btn_font_title":"Article read more button","f_btn_font_settings":"","f_btn_font_family":"","f_btn_font_size":"","f_btn_font_line_height":"","f_btn_font_style":"","f_btn_font_weight":"","f_btn_font_transform":"","f_btn_font_spacing":"","f_btn_":"","mix_color":"","mix_type":"","fe_brightness":"1","fe_contrast":"1","fe_saturate":"1","mix_color_h":"","mix_type_h":"","fe_brightness_h":"1","fe_contrast_h":"1","fe_saturate_h":"1","m_bg":"","color_overlay":"","shadow_shadow_header":"","shadow_shadow_title":"Module Shadow","shadow_shadow_size":"","shadow_shadow_offset_horizontal":"","shadow_shadow_offset_vertical":"","shadow_shadow_spread":"","shadow_shadow_color":"","title_txt":"","title_txt_hover":"","all_underline_height":"","all_underline_color":"","cat_bg":"","cat_bg_hover":"","cat_txt":"","cat_txt_hover":"","cat_border":"","cat_border_hover":"","meta_bg":"","author_txt":"","author_txt_hover":"","date_txt":"","ex_txt":"","com_bg":"","com_txt":"","rev_txt":"","audio_btn_color":"","audio_time_color":"","audio_bar_color":"","audio_bar_curr_color":"","shadow_m_shadow_header":"","shadow_m_shadow_title":"Meta info shadow","shadow_m_shadow_size":"","shadow_m_shadow_offset_horizontal":"","shadow_m_shadow_offset_vertical":"","shadow_m_shadow_spread":"","shadow_m_shadow_color":"","btn_bg":"","btn_bg_hover":"","btn_txt":"","btn_txt_hover":"","btn_border":"","btn_border_hover":"","pag_text":"","pag_h_text":"","pag_bg":"","pag_h_bg":"","pag_border":"","pag_h_border":"","ajax_pagination_next_prev_swipe":"","ajax_pagination_infinite_stop":"","css":"","tdc_css":"","td_column_number":1,"header_color":"","color_preset":"","border_top":"","class":"tdi_130","tdc_css_class":"tdi_130","tdc_css_class_style":"tdi_130_rand_style"}'; block_tdi_130.td_column_number = "1"; block_tdi_130.block_type = "td_flex_block_1"; block_tdi_130.post_count = "4"; block_tdi_130.found_posts = "3352"; block_tdi_130.header_color = ""; block_tdi_130.ajax_pagination_infinite_stop = ""; block_tdi_130.max_num_pages = "838"; tdBlocksArray.push(block_tdi_130); </script><div class="td-block-title-wrap"><h4 class="block-title td-block-title"><span class="td-pulldown-size">Most Popular</span></h4></div><div id=tdi_130 class="td_block_inner td-mc1-wrap"> <div class="td_module_flex td_module_flex_1 td_module_wrap td-animation-stack td-cpt-post"> <div class="td-module-container td-category-pos-"> <div class="td-image-container"> <div class="td-module-thumb"><a href="http://instadsc.in/index.php/2023/12/09/w4-games-raises-15m-to-drive-video-game-development-with-godot-engine/" rel="bookmark" class="td-image-wrap " title="W4 Games raises $15M to drive video game development with Godot Engine" ><span class="entry-thumb td-thumb-css" data-type="css_image" data-img-url="http://instadsc.in/wp-content/uploads/2023/12/9185-w4-games-raises-15m-to-drive-video-game-development-with-godot-engine-696x475.jpeg" ></span></a></div> </div> <div class="td-module-meta-info"> <h3 class="entry-title td-module-title"><a href="http://instadsc.in/index.php/2023/12/09/w4-games-raises-15m-to-drive-video-game-development-with-godot-engine/" rel="bookmark" title="W4 Games raises $15M to drive video game development with Godot Engine">W4 Games raises $15M to drive video game development with Godot Engine</a></h3> <div class="td-editor-date"> <span class="td-author-date"> <span class="td-post-date"><time class="entry-date updated td-module-date" datetime="2023-12-09T11:43:09+00:00" >December 9, 2023</time></span> </span> </div> </div> </div> </div> <div class="td_module_flex td_module_flex_1 td_module_wrap td-animation-stack td-cpt-post"> <div class="td-module-container td-category-pos-"> <div class="td-image-container"> <div class="td-module-thumb"><a href="http://instadsc.in/index.php/2023/12/09/apple-cuts-off-beeper-minis-access/" rel="bookmark" class="td-image-wrap " title="Apple cuts off Beeper Mini’s access" ><span class="entry-thumb td-thumb-css" data-type="css_image" data-img-url="http://instadsc.in/wp-content/uploads/2023/12/9187-apple-cuts-off-beeper-minis-access-696x392.jpg" ></span></a></div> </div> <div class="td-module-meta-info"> <h3 class="entry-title td-module-title"><a href="http://instadsc.in/index.php/2023/12/09/apple-cuts-off-beeper-minis-access/" rel="bookmark" title="Apple cuts off Beeper Mini’s access">Apple cuts off Beeper Mini’s access</a></h3> <div class="td-editor-date"> <span class="td-author-date"> <span class="td-post-date"><time class="entry-date updated td-module-date" datetime="2023-12-09T11:43:08+00:00" >December 9, 2023</time></span> </span> </div> </div> </div> </div> <div class="td_module_flex td_module_flex_1 td_module_wrap td-animation-stack td-cpt-post"> <div class="td-module-container td-category-pos-"> <div class="td-image-container"> <div class="td-module-thumb"><a href="http://instadsc.in/index.php/2023/12/09/openbao-foss-fork-of-hashicorp-vault/" rel="bookmark" class="td-image-wrap " title="OpenBao – FOSS Fork of HashiCorp Vault" ><span class="entry-thumb td-thumb-css" data-type="css_image" data-img-url="http://instadsc.in/wp-content/uploads/2023/12/9189-openbao-foss-fork-of-hashicorp-vault-696x348.jpg" ></span></a></div> </div> <div class="td-module-meta-info"> <h3 class="entry-title td-module-title"><a href="http://instadsc.in/index.php/2023/12/09/openbao-foss-fork-of-hashicorp-vault/" rel="bookmark" title="OpenBao – FOSS Fork of HashiCorp Vault">OpenBao – FOSS Fork of HashiCorp Vault</a></h3> <div class="td-editor-date"> <span class="td-author-date"> <span class="td-post-date"><time class="entry-date updated td-module-date" datetime="2023-12-09T11:43:07+00:00" >December 9, 2023</time></span> </span> </div> </div> </div> </div> <div class="td_module_flex td_module_flex_1 td_module_wrap td-animation-stack td-cpt-post"> <div class="td-module-container td-category-pos-"> <div class="td-image-container"> <div class="td-module-thumb"><a href="http://instadsc.in/index.php/2023/12/09/pysimplegui/" rel="bookmark" class="td-image-wrap " title="PysimpleGUI" ><span class="entry-thumb td-thumb-css" data-type="css_image" data-img-url="http://instadsc.in/wp-content/uploads/2023/12/9191-pysimplegui-696x348.jpg" ></span></a></div> </div> <div class="td-module-meta-info"> <h3 class="entry-title td-module-title"><a href="http://instadsc.in/index.php/2023/12/09/pysimplegui/" rel="bookmark" title="PysimpleGUI">PysimpleGUI</a></h3> <div class="td-editor-date"> <span class="td-author-date"> <span class="td-post-date"><time class="entry-date updated td-module-date" datetime="2023-12-09T11:43:06+00:00" >December 9, 2023</time></span> </span> </div> </div> </div> </div> </div><div class="td-load-more-wrap"><a href="#" class="td_ajax_load_more td_ajax_load_more_js" aria-label="load_more" id="next-page-tdi_130" data-td_block_id="tdi_130">Load more<i class="td-icon-font td-icon-menu-down"></i></a></div></div><div class="td_block_wrap vc_wp_recentcomments tdi_131 td-pb-border-top td_block_template_1" data-td-block-uid="tdi_131" > <style> /* custom css */ .tdi_131 .recentcomments{ margin: 0px !important; padding: 0 0 15px !important; border-bottom-color: #eaeaea; }.tdi_131 .td-block-title a, .tdi_131 .td-block-title span{ text-transform:uppercase !important; }.tdi_131 .comment-author-link span, .tdi_131 .comment-author-link a{ font-family:Open Sans !important; }.tdi_131 .recentcomments > a:last-child{ font-family:Open Sans !important; } </style><div class="td-block-title-wrap"><h4 class="block-title td-block-title"><span class="td-pulldown-size">Recent Comments</span></h4></div><div id=tdi_131 class="td_wp_recentcomments td_block_inner td-column-1 "></div></div> <!-- ./block --></div></div></div></div></div></div> <span class="td-page-meta" itemprop="author" itemscope itemtype="https://schema.org/Person"><meta itemprop="name" content="admin"><meta itemprop="url" content="http://instadsc.in/index.php/author/admin/"></span><meta itemprop="datePublished" content="2023-07-31T17:01:16+00:00"><meta itemprop="dateModified" content="2023-07-31T17:01:16+00:00"><meta itemscope itemprop="mainEntityOfPage" itemType="https://schema.org/WebPage" itemid="http://instadsc.in/index.php/2023/07/31/latex3-programming-in-latex-with-ease-2020/"/><span class="td-page-meta" itemprop="publisher" itemscope itemtype="https://schema.org/Organization"><span class="td-page-meta" itemprop="logo" itemscope itemtype="https://schema.org/ImageObject"><meta itemprop="url" content="http://instadsc.in/index.php/2023/07/31/latex3-programming-in-latex-with-ease-2020/"></span><meta itemprop="name" content="instadsc"></span><meta itemprop="headline" content="LaTeX3: Programming in LaTeX with Ease (2020)"><span class="td-page-meta" itemprop="image" itemscope itemtype="https://schema.org/ImageObject"><meta itemprop="url" content="http://instadsc.in/wp-content/uploads/2023/07/6953-latex3-programming-in-latex-with-ease-2020.svg"><meta itemprop="width" content="0"><meta itemprop="height" content="0"></span> </article> </div> </div> </div> <!-- #tdb-autoload-article --> <!-- Instagram --> <div class="td-footer-template-wrap" style="position: relative"> <div class="td-footer-wrap "> <div id="tdi_132" class="tdc-zone"><div class="tdc_zone tdi_133 wpb_row td-pb-row" > <style scoped> /* custom css */ .tdi_133{ min-height: 0; } </style><div id="tdi_134" class="tdc-row stretch_row"><div class="vc_row tdi_135 wpb_row td-pb-row tdc-element-style" > <style scoped> /* custom css */ .tdi_135, .tdi_135 .tdc-columns{ min-height: 0; }.tdi_135, .tdi_135 .tdc-columns{ display: block; }.tdi_135 .tdc-columns{ width: 100%; } /* inline tdc_css att */ .tdi_135{ padding-top:54px !important; padding-bottom:20px !important; position:relative; } .tdi_135 .td_block_wrap{ text-align:left } /* phone */ @media (max-width: 767px) { .tdi_135{ padding-top:40px !important; } } /* portrait */ @media (min-width: 768px) and (max-width: 1018px) { .tdi_135{ padding-top:44px !important; } } </style> <div class="tdi_134_rand_style td-element-style" ><div class="td-element-style-before"><style> .tdi_134_rand_style > .td-element-style-before { content:'' !important; width:100% !important; height:100% !important; position:absolute !important; top:0 !important; left:0 !important; display:block !important; z-index:0 !important; background-image:url("http://instadsc.in/wp-content/uploads/2023/03/footer_bg.jpg") !important; opacity:0.1 !important; background-size:cover !important; background-position:center top !important; } </style></div><style> .tdi_134_rand_style{ background-color:#111111 !important; } </style></div><div class="vc_column tdi_137 wpb_column vc_column_container tdc-column td-pb-span12"> <style scoped> /* custom css */ .tdi_137{ vertical-align: baseline; }.tdi_137 > .wpb_wrapper, .tdi_137 > .wpb_wrapper > .tdc-elements{ display: block; }.tdi_137 > .wpb_wrapper > .tdc-elements{ width: 100%; }.tdi_137 > .wpb_wrapper > .vc_row_inner{ width: auto; }.tdi_137 > .wpb_wrapper{ width: auto; height: auto; } </style><div class="wpb_wrapper"><div class="vc_row_inner tdi_139 vc_row vc_inner wpb_row td-pb-row" > <style scoped> /* custom css */ .tdi_139{ position: relative !important; top: 0; transform: none; -webkit-transform: none; }.tdi_139, .tdi_139 .tdc-inner-columns{ display: block; }.tdi_139 .tdc-inner-columns{ width: 100%; } </style><div class="vc_column_inner tdi_141 wpb_column vc_column_container tdc-inner-column td-pb-span4"> <style scoped> /* custom css */ .tdi_141{ vertical-align: baseline; }.tdi_141 .vc_column-inner > .wpb_wrapper, .tdi_141 .vc_column-inner > .wpb_wrapper .tdc-elements{ display: block; }.tdi_141 .vc_column-inner > .wpb_wrapper .tdc-elements{ width: 100%; } </style><div class="vc_column-inner"><div class="wpb_wrapper"><div class="td_block_wrap td_flex_block_1 tdi_142 td-pb-border-top td_block_template_2 td_flex_block" data-td-block-uid="tdi_142" > <style> .td_block_template_2.widget > ul > li { margin-left: 0 !important; } .td_block_template_2 .td-block-title { font-size: 17px; font-weight: 500; margin-top: 0; margin-bottom: 16px; line-height: 31px; text-align: left; } .td_block_template_2 .td-block-title > * { color: #000; } .td_block_template_2 .td-related-title a { padding: 0 20px 0 0; } @media (max-width: 767px) { .td_block_template_2 .td-related-title a { font-size: 15px; } } .td_block_template_2 .td-related-title .td-cur-simple-item { color: #4db2ec; } .td-theme-wrap .tdi_142 .td-block-title > *, .td-theme-wrap .tdi_142 .td-pulldown-filter-link:hover, .td-theme-wrap .tdi_142 .td-subcat-item a:hover, .td-theme-wrap .tdi_142 .td-subcat-item .td-cur-simple-item, .td-theme-wrap .tdi_142 .td-subcat-dropdown:hover .td-subcat-more span, .td-theme-wrap .tdi_142 .td-subcat-dropdown:hover .td-subcat-more i { color: #ffffff; } .td-theme-wrap .tdi_142 .td-subcat-dropdown ul:after { background-color: #ffffff; } .td-theme-wrap .tdi_142 .td_module_wrap:hover .entry-title a, .td-theme-wrap .tdi_142 .td_quote_on_blocks, .td-theme-wrap .tdi_142 .td-opacity-cat .td-post-category:hover, .td-theme-wrap .tdi_142 .td-opacity-read .td-read-more a:hover, .td-theme-wrap .tdi_142 .td-opacity-author .td-post-author-name a:hover, .td-theme-wrap .tdi_142 .td-instagram-user a { color: #ffffff; } .td-theme-wrap .tdi_142 .td-next-prev-wrap a:hover, .td-theme-wrap .tdi_142 .td-load-more-wrap a:hover { background-color: #ffffff; border-color: #ffffff; } .td-theme-wrap .tdi_142 .td-read-more a, .td-theme-wrap .tdi_142 .td-weather-information:before, .td-theme-wrap .tdi_142 .td-weather-week:before, .td-theme-wrap .tdi_142 .td-exchange-header:before, .td-theme-wrap .td-footer-wrapper .tdi_142 .td-post-category, .td-theme-wrap .tdi_142 .td-post-category:hover { background-color: #ffffff; } /* inline tdc_css att */ /* phone */ @media (max-width: 767px) { .tdi_142{ margin-bottom:40px !important; } } /* portrait */ @media (min-width: 768px) and (max-width: 1018px) { .tdi_142{ margin-bottom:20px !important; } } </style> <style> /* custom css */ .tdi_142 .td-image-wrap{ padding-bottom: 70%; }.tdi_142 .entry-thumb{ background-position: center 50%; }.tdi_142 .td-image-container{ flex: 0 0 30%; width: 30%; display: block; order: 0; }.ie10 .tdi_142 .td-image-container, .ie11 .tdi_142 .td-image-container{ flex: 0 0 auto; }.tdi_142 .td-module-container{ flex-direction: row; border-color: #eaeaea !important; }.ie10 .tdi_142 .td-module-meta-info, .ie11 .tdi_142 .td-module-meta-info{ flex: 1; }.tdi_142 .td-module-meta-info{ padding: 0 0 0 16px; border-color: #eaeaea; }.tdi_142 .td_module_wrap{ padding-left: 20px; padding-right: 20px; padding-bottom: 13px; margin-bottom: 13px; }.tdi_142 .td_block_inner{ margin-left: -20px; margin-right: -20px; }.tdi_142 .td-module-container:before{ bottom: -13px; border-color: #eaeaea; }.tdi_142 .td-video-play-ico{ width: 24px; height: 24px; font-size: 24px; }.tdi_142 .td-post-vid-time{ display: block; }.tdi_142 .td-post-category:not(.td-post-extra-category){ display: none; }.tdi_142 .td-author-photo .avatar{ width: 20px; height: 20px; margin-right: 6px; border-radius: 50%; }.tdi_142 .td-excerpt{ display: none; column-count: 1; column-gap: 48px; }.tdi_142 .td-audio-player{ opacity: 1; visibility: visible; height: auto; font-size: 13px; }.tdi_142 .td-read-more{ display: none; }.tdi_142 .td-author-date{ display: inline; }.tdi_142 .td-post-author-name{ display: none; }.tdi_142 .entry-review-stars{ display: inline-block; color: #ffffff; }.tdi_142 .td-icon-star, .tdi_142 .td-icon-star-empty, .tdi_142 .td-icon-star-half{ font-size: 15px; }.tdi_142 .td-module-comments{ display: none; }.tdi_142 .td_module_wrap:nth-last-child(1){ margin-bottom: 0; padding-bottom: 0; }.tdi_142 .td_module_wrap:nth-last-child(1) .td-module-container:before{ display: none; }.tdi_142 .td-module-title a{ color: #ffffff; }.tdi_142 .td_module_wrap:hover .td-module-title a{ color: #4db2ec !important; }.tdi_142 .td-module-exclusive .td-module-title a:before{ display: inline-block; }.tdi_142 .td-block-title a, .tdi_142 .td-block-title span{ font-size:18px !important; }.tdi_142 .entry-title{ font-size:14px !important;line-height:1.4 !important;font-weight:500 !important; }html:not([class*='ie']) .tdi_142 .td-module-container:hover .entry-thumb:before{ opacity: 0; } /* landscape */ @media (min-width: 1019px) and (max-width: 1140px){ .tdi_142 .td_module_wrap{ padding-bottom: 13px; margin-bottom: 13px; padding-bottom: 13px !important; margin-bottom: 13px !important; }.tdi_142 .td-module-container:before{ bottom: -13px; }.tdi_142 .td_module_wrap:nth-last-child(1){ margin-bottom: 0 !important; padding-bottom: 0 !important; }.tdi_142 .td_module_wrap .td-module-container:before{ display: block !important; }.tdi_142 .td_module_wrap:nth-last-child(1) .td-module-container:before{ display: none !important; } } /* portrait */ @media (min-width: 768px) and (max-width: 1018px){ .tdi_142 .td-module-meta-info{ padding: 0 0 0 13px; }.tdi_142 .td_module_wrap{ width: 100%; float: left; padding-left: 10px; padding-right: 10px; padding-bottom: 10px; margin-bottom: 10px; padding-bottom: 10px !important; margin-bottom: 10px !important; }.rtl .tdi_142 .td_module_wrap{ float: right; }.tdi_142 .td_block_inner{ margin-left: -10px; margin-right: -10px; }.tdi_142 .td-module-container:before{ bottom: -10px; }.tdi_142 .td_module_wrap:nth-last-child(1){ margin-bottom: 0 !important; padding-bottom: 0 !important; }.tdi_142 .td_module_wrap .td-module-container:before{ display: block !important; }.tdi_142 .td_module_wrap:nth-last-child(1) .td-module-container:before{ display: none !important; }.tdi_142 .entry-title{ font-size:12px !important;line-height:1.4 !important;font-weight:500 !important; } } /* phone */ @media (max-width: 767px){ .tdi_142 .td_module_wrap{ width: 100%; float: left; padding-bottom: 13px; margin-bottom: 13px; padding-bottom: 13px !important; margin-bottom: 13px !important; }.rtl .tdi_142 .td_module_wrap{ float: right; }.tdi_142 .td-module-container:before{ bottom: -13px; }.tdi_142 .td_module_wrap:nth-last-child(1){ margin-bottom: 0 !important; padding-bottom: 0 !important; }.tdi_142 .td_module_wrap .td-module-container:before{ display: block !important; }.tdi_142 .td_module_wrap:nth-last-child(1) .td-module-container:before{ display: none !important; } } </style><script>var block_tdi_142 = new tdBlock(); block_tdi_142.id = "tdi_142"; block_tdi_142.atts = '{"modules_on_row":"eyJwb3J0cmFpdCI6IjEwMCUiLCJwaG9uZSI6IjEwMCUifQ==","image_size":"td_218x150","image_floated":"float_left","image_width":"30","image_height":"70","show_btn":"none","show_excerpt":"none","show_com":"none","show_author":"none","show_cat":"none","meta_padding":"eyJhbGwiOiIwIDAgMCAxNnB4IiwicG9ydHJhaXQiOiIwIDAgMCAxM3B4In0=","f_title_font_size":"eyJhbGwiOiIxNCIsInBvcnRyYWl0IjoiMTIifQ==","f_title_font_line_height":"1.4","f_title_font_weight":"500","all_modules_space":"eyJhbGwiOiIyNiIsInBvcnRyYWl0IjoiMjAiLCJwaG9uZSI6IjI2In0=","category_id":"","modules_gap":"eyJwb3J0cmFpdCI6IjIwIn0=","show_date":"","limit":"3","custom_title":"EDITOR PICKS","block_template_id":"td_block_template_2","f_header_font_size":"18","f_header_font_weight":"","header_text_color":"#ffffff","title_txt":"#ffffff","sort":"","title_txt_hover":"#4db2ec","tdc_css":"eyJwaG9uZSI6eyJtYXJnaW4tYm90dG9tIjoiNDAiLCJkaXNwbGF5IjoiIn0sInBob25lX21heF93aWR0aCI6NzY3LCJwb3J0cmFpdCI6eyJtYXJnaW4tYm90dG9tIjoiMjAiLCJkaXNwbGF5IjoiIn0sInBvcnRyYWl0X21heF93aWR0aCI6MTAxOCwicG9ydHJhaXRfbWluX3dpZHRoIjo3Njh9","rev_txt":"#ffffff","post_ids":"-6953","video_icon":"24","block_type":"td_flex_block_1","separator":"","custom_url":"","title_tag":"","mc1_tl":"","mc1_title_tag":"","mc1_el":"","taxonomies":"","category_ids":"","in_all_terms":"","tag_slug":"","autors_id":"","installed_post_types":"","locked_only":"","offset":"","show_modified_date":"","time_ago":"","time_ago_add_txt":"ago","time_ago_txt_pos":"","el_class":"","td_ajax_filter_type":"","td_ajax_filter_ids":"","td_filter_default_txt":"All","td_ajax_preloading":"","container_width":"","m_padding":"","modules_border_size":"","modules_border_style":"","modules_border_color":"#eaeaea","modules_border_radius":"","modules_divider":"","modules_divider_color":"#eaeaea","h_effect":"","image_alignment":"50","image_radius":"","hide_image":"","video_popup":"yes","video_rec":"","spot_header":"","video_rec_title":"","video_rec_color":"","video_rec_disable":"","autoplay_vid":"yes","show_vid_t":"block","vid_t_margin":"","vid_t_padding":"","video_title_color":"","video_title_color_h":"","video_bg":"","video_overlay":"","vid_t_color":"","vid_t_bg_color":"","f_vid_title_font_header":"","f_vid_title_font_title":"Video pop-up article title","f_vid_title_font_settings":"","f_vid_title_font_family":"","f_vid_title_font_size":"","f_vid_title_font_line_height":"","f_vid_title_font_style":"","f_vid_title_font_weight":"","f_vid_title_font_transform":"","f_vid_title_font_spacing":"","f_vid_title_":"","f_vid_time_font_title":"Video duration text","f_vid_time_font_settings":"","f_vid_time_font_family":"","f_vid_time_font_size":"","f_vid_time_font_line_height":"","f_vid_time_font_style":"","f_vid_time_font_weight":"","f_vid_time_font_transform":"","f_vid_time_font_spacing":"","f_vid_time_":"","excl_show":"inline-block","excl_txt":"","excl_margin":"","excl_padd":"","all_excl_border":"","all_excl_border_style":"solid","excl_radius":"","excl_color":"","excl_color_h":"","excl_bg":"","excl_bg_h":"","all_excl_border_color":"","excl_border_color_h":"","f_excl_font_header":"","f_excl_font_title":"Label text","f_excl_font_settings":"","f_excl_font_family":"","f_excl_font_size":"","f_excl_font_line_height":"","f_excl_font_style":"","f_excl_font_weight":"","f_excl_font_transform":"","f_excl_font_spacing":"","f_excl_":"","meta_info_align":"","meta_info_horiz":"layout-default","meta_width":"","meta_margin":"","meta_space":"","art_title":"","art_btn":"","meta_info_border_size":"","meta_info_border_style":"","meta_info_border_color":"#eaeaea","meta_info_border_radius":"","modules_category":"","modules_category_margin":"","modules_category_padding":"","modules_cat_border":"","modules_category_radius":"0","modules_extra_cat":"","author_photo":"","author_photo_size":"","author_photo_space":"","author_photo_radius":"","show_review":"inline-block","review_space":"","review_size":"2.5","review_distance":"","art_excerpt":"","excerpt_col":"1","excerpt_gap":"","excerpt_middle":"","excerpt_inline":"","show_audio":"block","hide_audio":"","art_audio":"","art_audio_size":"1.5","btn_title":"","btn_margin":"","btn_padding":"","btn_border_width":"","btn_radius":"","pag_space":"","pag_padding":"","pag_border_width":"","pag_border_radius":"","prev_tdicon":"","next_tdicon":"","pag_icons_size":"","f_header_font_header":"","f_header_font_title":"Block header","f_header_font_settings":"","f_header_font_family":"","f_header_font_line_height":"","f_header_font_style":"","f_header_font_transform":"","f_header_font_spacing":"","f_header_":"","f_ajax_font_title":"Ajax categories","f_ajax_font_settings":"","f_ajax_font_family":"","f_ajax_font_size":"","f_ajax_font_line_height":"","f_ajax_font_style":"","f_ajax_font_weight":"","f_ajax_font_transform":"","f_ajax_font_spacing":"","f_ajax_":"","f_more_font_title":"Load more button","f_more_font_settings":"","f_more_font_family":"","f_more_font_size":"","f_more_font_line_height":"","f_more_font_style":"","f_more_font_weight":"","f_more_font_transform":"","f_more_font_spacing":"","f_more_":"","f_title_font_header":"","f_title_font_title":"Article title","f_title_font_settings":"","f_title_font_family":"","f_title_font_style":"","f_title_font_transform":"","f_title_font_spacing":"","f_title_":"","f_cat_font_title":"Article category tag","f_cat_font_settings":"","f_cat_font_family":"","f_cat_font_size":"","f_cat_font_line_height":"","f_cat_font_style":"","f_cat_font_weight":"","f_cat_font_transform":"","f_cat_font_spacing":"","f_cat_":"","f_meta_font_title":"Article meta info","f_meta_font_settings":"","f_meta_font_family":"","f_meta_font_size":"","f_meta_font_line_height":"","f_meta_font_style":"","f_meta_font_weight":"","f_meta_font_transform":"","f_meta_font_spacing":"","f_meta_":"","f_ex_font_title":"Article excerpt","f_ex_font_settings":"","f_ex_font_family":"","f_ex_font_size":"","f_ex_font_line_height":"","f_ex_font_style":"","f_ex_font_weight":"","f_ex_font_transform":"","f_ex_font_spacing":"","f_ex_":"","f_btn_font_title":"Article read more button","f_btn_font_settings":"","f_btn_font_family":"","f_btn_font_size":"","f_btn_font_line_height":"","f_btn_font_style":"","f_btn_font_weight":"","f_btn_font_transform":"","f_btn_font_spacing":"","f_btn_":"","mix_color":"","mix_type":"","fe_brightness":"1","fe_contrast":"1","fe_saturate":"1","mix_color_h":"","mix_type_h":"","fe_brightness_h":"1","fe_contrast_h":"1","fe_saturate_h":"1","m_bg":"","color_overlay":"","shadow_shadow_header":"","shadow_shadow_title":"Module Shadow","shadow_shadow_size":"","shadow_shadow_offset_horizontal":"","shadow_shadow_offset_vertical":"","shadow_shadow_spread":"","shadow_shadow_color":"","all_underline_height":"","all_underline_color":"","cat_bg":"","cat_bg_hover":"","cat_txt":"","cat_txt_hover":"","cat_border":"","cat_border_hover":"","meta_bg":"","author_txt":"","author_txt_hover":"","date_txt":"","ex_txt":"","com_bg":"","com_txt":"","audio_btn_color":"","audio_time_color":"","audio_bar_color":"","audio_bar_curr_color":"","shadow_m_shadow_header":"","shadow_m_shadow_title":"Meta info shadow","shadow_m_shadow_size":"","shadow_m_shadow_offset_horizontal":"","shadow_m_shadow_offset_vertical":"","shadow_m_shadow_spread":"","shadow_m_shadow_color":"","btn_bg":"","btn_bg_hover":"","btn_txt":"","btn_txt_hover":"","btn_border":"","btn_border_hover":"","pag_text":"","pag_h_text":"","pag_bg":"","pag_h_bg":"","pag_border":"","pag_h_border":"","ajax_pagination":"","ajax_pagination_next_prev_swipe":"","ajax_pagination_infinite_stop":"","css":"","td_column_number":1,"header_color":"","color_preset":"","border_top":"","class":"tdi_142","tdc_css_class":"tdi_142","tdc_css_class_style":"tdi_142_rand_style"}'; block_tdi_142.td_column_number = "1"; block_tdi_142.block_type = "td_flex_block_1"; block_tdi_142.post_count = "3"; block_tdi_142.found_posts = "3352"; block_tdi_142.header_color = ""; block_tdi_142.ajax_pagination_infinite_stop = ""; block_tdi_142.max_num_pages = "1118"; tdBlocksArray.push(block_tdi_142); </script><div class="td-block-title-wrap"><h4 class="td-block-title"><span class="td-pulldown-size">EDITOR PICKS</span></h4></div><div id=tdi_142 class="td_block_inner td-mc1-wrap"> <div class="td_module_flex td_module_flex_1 td_module_wrap td-animation-stack td-cpt-post"> <div class="td-module-container td-category-pos-"> <div class="td-image-container"> <div class="td-module-thumb"><a href="http://instadsc.in/index.php/2023/12/09/w4-games-raises-15m-to-drive-video-game-development-with-godot-engine/" rel="bookmark" class="td-image-wrap " title="W4 Games raises $15M to drive video game development with Godot Engine" ><span class="entry-thumb td-thumb-css" data-type="css_image" data-img-url="http://instadsc.in/wp-content/uploads/2023/12/9185-w4-games-raises-15m-to-drive-video-game-development-with-godot-engine-218x150.jpeg" ></span></a></div> </div> <div class="td-module-meta-info"> <h3 class="entry-title td-module-title"><a href="http://instadsc.in/index.php/2023/12/09/w4-games-raises-15m-to-drive-video-game-development-with-godot-engine/" rel="bookmark" title="W4 Games raises $15M to drive video game development with Godot Engine">W4 Games raises $15M to drive video game development with Godot Engine</a></h3> <div class="td-editor-date"> <span class="td-author-date"> <span class="td-post-date"><time class="entry-date updated td-module-date" datetime="2023-12-09T11:43:09+00:00" >December 9, 2023</time></span> </span> </div> </div> </div> </div> <div class="td_module_flex td_module_flex_1 td_module_wrap td-animation-stack td-cpt-post"> <div class="td-module-container td-category-pos-"> <div class="td-image-container"> <div class="td-module-thumb"><a href="http://instadsc.in/index.php/2023/12/09/apple-cuts-off-beeper-minis-access/" rel="bookmark" class="td-image-wrap " title="Apple cuts off Beeper Mini’s access" ><span class="entry-thumb td-thumb-css" data-type="css_image" data-img-url="http://instadsc.in/wp-content/uploads/2023/12/9187-apple-cuts-off-beeper-minis-access-218x150.jpg" ></span></a></div> </div> <div class="td-module-meta-info"> <h3 class="entry-title td-module-title"><a href="http://instadsc.in/index.php/2023/12/09/apple-cuts-off-beeper-minis-access/" rel="bookmark" title="Apple cuts off Beeper Mini’s access">Apple cuts off Beeper Mini’s access</a></h3> <div class="td-editor-date"> <span class="td-author-date"> <span class="td-post-date"><time class="entry-date updated td-module-date" datetime="2023-12-09T11:43:08+00:00" >December 9, 2023</time></span> </span> </div> </div> </div> </div> <div class="td_module_flex td_module_flex_1 td_module_wrap td-animation-stack td-cpt-post"> <div class="td-module-container td-category-pos-"> <div class="td-image-container"> <div class="td-module-thumb"><a href="http://instadsc.in/index.php/2023/12/09/openbao-foss-fork-of-hashicorp-vault/" rel="bookmark" class="td-image-wrap " title="OpenBao – FOSS Fork of HashiCorp Vault" ><span class="entry-thumb td-thumb-css" data-type="css_image" data-img-url="http://instadsc.in/wp-content/uploads/2023/12/9189-openbao-foss-fork-of-hashicorp-vault-218x150.jpg" ></span></a></div> </div> <div class="td-module-meta-info"> <h3 class="entry-title td-module-title"><a href="http://instadsc.in/index.php/2023/12/09/openbao-foss-fork-of-hashicorp-vault/" rel="bookmark" title="OpenBao – FOSS Fork of HashiCorp Vault">OpenBao – FOSS Fork of HashiCorp Vault</a></h3> <div class="td-editor-date"> <span class="td-author-date"> <span class="td-post-date"><time class="entry-date updated td-module-date" datetime="2023-12-09T11:43:07+00:00" >December 9, 2023</time></span> </span> </div> </div> </div> </div> </div></div></div></div></div><div class="vc_column_inner tdi_144 wpb_column vc_column_container tdc-inner-column td-pb-span4"> <style scoped> /* custom css */ .tdi_144{ vertical-align: baseline; }.tdi_144 .vc_column-inner > .wpb_wrapper, .tdi_144 .vc_column-inner > .wpb_wrapper .tdc-elements{ display: block; }.tdi_144 .vc_column-inner > .wpb_wrapper .tdc-elements{ width: 100%; } </style><div class="vc_column-inner"><div class="wpb_wrapper"><div class="td_block_wrap td_flex_block_1 tdi_145 td-pb-border-top td_block_template_2 td_flex_block" data-td-block-uid="tdi_145" > <style> .td-theme-wrap .tdi_145 .td-block-title > *, .td-theme-wrap .tdi_145 .td-pulldown-filter-link:hover, .td-theme-wrap .tdi_145 .td-subcat-item a:hover, .td-theme-wrap .tdi_145 .td-subcat-item .td-cur-simple-item, .td-theme-wrap .tdi_145 .td-subcat-dropdown:hover .td-subcat-more span, .td-theme-wrap .tdi_145 .td-subcat-dropdown:hover .td-subcat-more i { color: #ffffff; } .td-theme-wrap .tdi_145 .td-subcat-dropdown ul:after { background-color: #ffffff; } .td-theme-wrap .tdi_145 .td_module_wrap:hover .entry-title a, .td-theme-wrap .tdi_145 .td_quote_on_blocks, .td-theme-wrap .tdi_145 .td-opacity-cat .td-post-category:hover, .td-theme-wrap .tdi_145 .td-opacity-read .td-read-more a:hover, .td-theme-wrap .tdi_145 .td-opacity-author .td-post-author-name a:hover, .td-theme-wrap .tdi_145 .td-instagram-user a { color: #ffffff; } .td-theme-wrap .tdi_145 .td-next-prev-wrap a:hover, .td-theme-wrap .tdi_145 .td-load-more-wrap a:hover { background-color: #ffffff; border-color: #ffffff; } .td-theme-wrap .tdi_145 .td-read-more a, .td-theme-wrap .tdi_145 .td-weather-information:before, .td-theme-wrap .tdi_145 .td-weather-week:before, .td-theme-wrap .tdi_145 .td-exchange-header:before, .td-theme-wrap .td-footer-wrapper .tdi_145 .td-post-category, .td-theme-wrap .tdi_145 .td-post-category:hover { background-color: #ffffff; } /* inline tdc_css att */ /* phone */ @media (max-width: 767px) { .tdi_145{ margin-bottom:48px !important; } } /* portrait */ @media (min-width: 768px) and (max-width: 1018px) { .tdi_145{ margin-bottom:20px !important; } } </style> <style> /* custom css */ .tdi_145 .td-image-wrap{ padding-bottom: 70%; }.tdi_145 .entry-thumb{ background-position: center 50%; }.tdi_145 .td-image-container{ flex: 0 0 30%; width: 30%; display: block; order: 0; }.ie10 .tdi_145 .td-image-container, .ie11 .tdi_145 .td-image-container{ flex: 0 0 auto; }.tdi_145 .td-module-container{ flex-direction: row; border-color: #eaeaea !important; }.ie10 .tdi_145 .td-module-meta-info, .ie11 .tdi_145 .td-module-meta-info{ flex: 1; }.tdi_145 .td-module-meta-info{ padding: 0 0 0 16px; border-color: #eaeaea; }.tdi_145 .td_module_wrap{ padding-left: 20px; padding-right: 20px; padding-bottom: 13px; margin-bottom: 13px; }.tdi_145 .td_block_inner{ margin-left: -20px; margin-right: -20px; }.tdi_145 .td-module-container:before{ bottom: -13px; border-color: #eaeaea; }.tdi_145 .td-video-play-ico{ width: 24px; height: 24px; font-size: 24px; }.tdi_145 .td-post-vid-time{ display: block; }.tdi_145 .td-post-category:not(.td-post-extra-category){ display: none; }.tdi_145 .td-author-photo .avatar{ width: 20px; height: 20px; margin-right: 6px; border-radius: 50%; }.tdi_145 .td-excerpt{ display: none; column-count: 1; column-gap: 48px; }.tdi_145 .td-audio-player{ opacity: 1; visibility: visible; height: auto; font-size: 13px; }.tdi_145 .td-read-more{ display: none; }.tdi_145 .td-author-date{ display: inline; }.tdi_145 .td-post-author-name{ display: none; }.tdi_145 .entry-review-stars{ display: inline-block; color: #ffffff; }.tdi_145 .td-icon-star, .tdi_145 .td-icon-star-empty, .tdi_145 .td-icon-star-half{ font-size: 15px; }.tdi_145 .td-module-comments{ display: none; }.tdi_145 .td_module_wrap:nth-last-child(1){ margin-bottom: 0; padding-bottom: 0; }.tdi_145 .td_module_wrap:nth-last-child(1) .td-module-container:before{ display: none; }.tdi_145 .td-module-title a{ color: #ffffff; }.tdi_145 .td_module_wrap:hover .td-module-title a{ color: #4db2ec !important; }.tdi_145 .td-module-exclusive .td-module-title a:before{ display: inline-block; }.tdi_145 .td-block-title a, .tdi_145 .td-block-title span{ font-size:18px !important; }.tdi_145 .entry-title{ font-size:14px !important;line-height:1.4 !important;font-weight:500 !important; }html:not([class*='ie']) .tdi_145 .td-module-container:hover .entry-thumb:before{ opacity: 0; } /* landscape */ @media (min-width: 1019px) and (max-width: 1140px){ .tdi_145 .td_module_wrap{ padding-bottom: 13px; margin-bottom: 13px; padding-bottom: 13px !important; margin-bottom: 13px !important; }.tdi_145 .td-module-container:before{ bottom: -13px; }.tdi_145 .td_module_wrap:nth-last-child(1){ margin-bottom: 0 !important; padding-bottom: 0 !important; }.tdi_145 .td_module_wrap .td-module-container:before{ display: block !important; }.tdi_145 .td_module_wrap:nth-last-child(1) .td-module-container:before{ display: none !important; } } /* portrait */ @media (min-width: 768px) and (max-width: 1018px){ .tdi_145 .td-module-meta-info{ padding: 0 0 0 13px; }.tdi_145 .td_module_wrap{ width: 100%; float: left; padding-left: 10px; padding-right: 10px; padding-bottom: 10px; margin-bottom: 10px; padding-bottom: 10px !important; margin-bottom: 10px !important; }.rtl .tdi_145 .td_module_wrap{ float: right; }.tdi_145 .td_block_inner{ margin-left: -10px; margin-right: -10px; }.tdi_145 .td-module-container:before{ bottom: -10px; }.tdi_145 .td_module_wrap:nth-last-child(1){ margin-bottom: 0 !important; padding-bottom: 0 !important; }.tdi_145 .td_module_wrap .td-module-container:before{ display: block !important; }.tdi_145 .td_module_wrap:nth-last-child(1) .td-module-container:before{ display: none !important; }.tdi_145 .entry-title{ font-size:12px !important;line-height:1.4 !important;font-weight:500 !important; } } /* phone */ @media (max-width: 767px){ .tdi_145 .td_module_wrap{ width: 100%; float: left; padding-bottom: 13px; margin-bottom: 13px; padding-bottom: 13px !important; margin-bottom: 13px !important; }.rtl .tdi_145 .td_module_wrap{ float: right; }.tdi_145 .td-module-container:before{ bottom: -13px; }.tdi_145 .td_module_wrap:nth-last-child(1){ margin-bottom: 0 !important; padding-bottom: 0 !important; }.tdi_145 .td_module_wrap .td-module-container:before{ display: block !important; }.tdi_145 .td_module_wrap:nth-last-child(1) .td-module-container:before{ display: none !important; } } </style><script>var block_tdi_145 = new tdBlock(); block_tdi_145.id = "tdi_145"; block_tdi_145.atts = '{"modules_on_row":"eyJwb3J0cmFpdCI6IjEwMCUiLCJwaG9uZSI6IjEwMCUifQ==","image_size":"td_218x150","image_floated":"float_left","image_width":"30","image_height":"70","show_btn":"none","show_excerpt":"none","show_com":"none","show_author":"none","show_cat":"none","meta_padding":"eyJhbGwiOiIwIDAgMCAxNnB4IiwicGhvbmUiOiIwIDAgMCAxNnB4IiwicG9ydHJhaXQiOiIwIDAgMCAxM3B4In0=","f_title_font_size":"eyJhbGwiOiIxNCIsInBvcnRyYWl0IjoiMTIifQ==","f_title_font_line_height":"1.4","f_title_font_weight":"500","all_modules_space":"eyJhbGwiOiIyNiIsInBvcnRyYWl0IjoiMjAiLCJwaG9uZSI6IjI2In0=","category_id":"","modules_gap":"eyJwb3J0cmFpdCI6IjIwIn0=","show_date":"","limit":"3","custom_title":"POPULAR POSTS","block_template_id":"td_block_template_2","f_header_font_size":"18","f_header_font_weight":"","header_text_color":"#ffffff","title_txt":"#ffffff","sort":"","title_txt_hover":"#4db2ec","tdc_css":"eyJwaG9uZSI6eyJtYXJnaW4tYm90dG9tIjoiNDgiLCJkaXNwbGF5IjoiIn0sInBob25lX21heF93aWR0aCI6NzY3LCJwb3J0cmFpdCI6eyJtYXJnaW4tYm90dG9tIjoiMjAiLCJkaXNwbGF5IjoiIn0sInBvcnRyYWl0X21heF93aWR0aCI6MTAxOCwicG9ydHJhaXRfbWluX3dpZHRoIjo3Njh9","post_ids":"-6953","rev_txt":"#ffffff","video_icon":"24","block_type":"td_flex_block_1","separator":"","custom_url":"","title_tag":"","mc1_tl":"","mc1_title_tag":"","mc1_el":"","taxonomies":"","category_ids":"","in_all_terms":"","tag_slug":"","autors_id":"","installed_post_types":"","locked_only":"","offset":"","show_modified_date":"","time_ago":"","time_ago_add_txt":"ago","time_ago_txt_pos":"","el_class":"","td_ajax_filter_type":"","td_ajax_filter_ids":"","td_filter_default_txt":"All","td_ajax_preloading":"","container_width":"","m_padding":"","modules_border_size":"","modules_border_style":"","modules_border_color":"#eaeaea","modules_border_radius":"","modules_divider":"","modules_divider_color":"#eaeaea","h_effect":"","image_alignment":"50","image_radius":"","hide_image":"","video_popup":"yes","video_rec":"","spot_header":"","video_rec_title":"","video_rec_color":"","video_rec_disable":"","autoplay_vid":"yes","show_vid_t":"block","vid_t_margin":"","vid_t_padding":"","video_title_color":"","video_title_color_h":"","video_bg":"","video_overlay":"","vid_t_color":"","vid_t_bg_color":"","f_vid_title_font_header":"","f_vid_title_font_title":"Video pop-up article title","f_vid_title_font_settings":"","f_vid_title_font_family":"","f_vid_title_font_size":"","f_vid_title_font_line_height":"","f_vid_title_font_style":"","f_vid_title_font_weight":"","f_vid_title_font_transform":"","f_vid_title_font_spacing":"","f_vid_title_":"","f_vid_time_font_title":"Video duration text","f_vid_time_font_settings":"","f_vid_time_font_family":"","f_vid_time_font_size":"","f_vid_time_font_line_height":"","f_vid_time_font_style":"","f_vid_time_font_weight":"","f_vid_time_font_transform":"","f_vid_time_font_spacing":"","f_vid_time_":"","excl_show":"inline-block","excl_txt":"","excl_margin":"","excl_padd":"","all_excl_border":"","all_excl_border_style":"solid","excl_radius":"","excl_color":"","excl_color_h":"","excl_bg":"","excl_bg_h":"","all_excl_border_color":"","excl_border_color_h":"","f_excl_font_header":"","f_excl_font_title":"Label text","f_excl_font_settings":"","f_excl_font_family":"","f_excl_font_size":"","f_excl_font_line_height":"","f_excl_font_style":"","f_excl_font_weight":"","f_excl_font_transform":"","f_excl_font_spacing":"","f_excl_":"","meta_info_align":"","meta_info_horiz":"layout-default","meta_width":"","meta_margin":"","meta_space":"","art_title":"","art_btn":"","meta_info_border_size":"","meta_info_border_style":"","meta_info_border_color":"#eaeaea","meta_info_border_radius":"","modules_category":"","modules_category_margin":"","modules_category_padding":"","modules_cat_border":"","modules_category_radius":"0","modules_extra_cat":"","author_photo":"","author_photo_size":"","author_photo_space":"","author_photo_radius":"","show_review":"inline-block","review_space":"","review_size":"2.5","review_distance":"","art_excerpt":"","excerpt_col":"1","excerpt_gap":"","excerpt_middle":"","excerpt_inline":"","show_audio":"block","hide_audio":"","art_audio":"","art_audio_size":"1.5","btn_title":"","btn_margin":"","btn_padding":"","btn_border_width":"","btn_radius":"","pag_space":"","pag_padding":"","pag_border_width":"","pag_border_radius":"","prev_tdicon":"","next_tdicon":"","pag_icons_size":"","f_header_font_header":"","f_header_font_title":"Block header","f_header_font_settings":"","f_header_font_family":"","f_header_font_line_height":"","f_header_font_style":"","f_header_font_transform":"","f_header_font_spacing":"","f_header_":"","f_ajax_font_title":"Ajax categories","f_ajax_font_settings":"","f_ajax_font_family":"","f_ajax_font_size":"","f_ajax_font_line_height":"","f_ajax_font_style":"","f_ajax_font_weight":"","f_ajax_font_transform":"","f_ajax_font_spacing":"","f_ajax_":"","f_more_font_title":"Load more button","f_more_font_settings":"","f_more_font_family":"","f_more_font_size":"","f_more_font_line_height":"","f_more_font_style":"","f_more_font_weight":"","f_more_font_transform":"","f_more_font_spacing":"","f_more_":"","f_title_font_header":"","f_title_font_title":"Article title","f_title_font_settings":"","f_title_font_family":"","f_title_font_style":"","f_title_font_transform":"","f_title_font_spacing":"","f_title_":"","f_cat_font_title":"Article category tag","f_cat_font_settings":"","f_cat_font_family":"","f_cat_font_size":"","f_cat_font_line_height":"","f_cat_font_style":"","f_cat_font_weight":"","f_cat_font_transform":"","f_cat_font_spacing":"","f_cat_":"","f_meta_font_title":"Article meta info","f_meta_font_settings":"","f_meta_font_family":"","f_meta_font_size":"","f_meta_font_line_height":"","f_meta_font_style":"","f_meta_font_weight":"","f_meta_font_transform":"","f_meta_font_spacing":"","f_meta_":"","f_ex_font_title":"Article excerpt","f_ex_font_settings":"","f_ex_font_family":"","f_ex_font_size":"","f_ex_font_line_height":"","f_ex_font_style":"","f_ex_font_weight":"","f_ex_font_transform":"","f_ex_font_spacing":"","f_ex_":"","f_btn_font_title":"Article read more button","f_btn_font_settings":"","f_btn_font_family":"","f_btn_font_size":"","f_btn_font_line_height":"","f_btn_font_style":"","f_btn_font_weight":"","f_btn_font_transform":"","f_btn_font_spacing":"","f_btn_":"","mix_color":"","mix_type":"","fe_brightness":"1","fe_contrast":"1","fe_saturate":"1","mix_color_h":"","mix_type_h":"","fe_brightness_h":"1","fe_contrast_h":"1","fe_saturate_h":"1","m_bg":"","color_overlay":"","shadow_shadow_header":"","shadow_shadow_title":"Module Shadow","shadow_shadow_size":"","shadow_shadow_offset_horizontal":"","shadow_shadow_offset_vertical":"","shadow_shadow_spread":"","shadow_shadow_color":"","all_underline_height":"","all_underline_color":"","cat_bg":"","cat_bg_hover":"","cat_txt":"","cat_txt_hover":"","cat_border":"","cat_border_hover":"","meta_bg":"","author_txt":"","author_txt_hover":"","date_txt":"","ex_txt":"","com_bg":"","com_txt":"","audio_btn_color":"","audio_time_color":"","audio_bar_color":"","audio_bar_curr_color":"","shadow_m_shadow_header":"","shadow_m_shadow_title":"Meta info shadow","shadow_m_shadow_size":"","shadow_m_shadow_offset_horizontal":"","shadow_m_shadow_offset_vertical":"","shadow_m_shadow_spread":"","shadow_m_shadow_color":"","btn_bg":"","btn_bg_hover":"","btn_txt":"","btn_txt_hover":"","btn_border":"","btn_border_hover":"","pag_text":"","pag_h_text":"","pag_bg":"","pag_h_bg":"","pag_border":"","pag_h_border":"","ajax_pagination":"","ajax_pagination_next_prev_swipe":"","ajax_pagination_infinite_stop":"","css":"","td_column_number":1,"header_color":"","color_preset":"","border_top":"","class":"tdi_145","tdc_css_class":"tdi_145","tdc_css_class_style":"tdi_145_rand_style"}'; block_tdi_145.td_column_number = "1"; block_tdi_145.block_type = "td_flex_block_1"; block_tdi_145.post_count = "3"; block_tdi_145.found_posts = "3352"; block_tdi_145.header_color = ""; block_tdi_145.ajax_pagination_infinite_stop = ""; block_tdi_145.max_num_pages = "1118"; tdBlocksArray.push(block_tdi_145); </script><div class="td-block-title-wrap"><h4 class="td-block-title"><span class="td-pulldown-size">POPULAR POSTS</span></h4></div><div id=tdi_145 class="td_block_inner td-mc1-wrap"> <div class="td_module_flex td_module_flex_1 td_module_wrap td-animation-stack td-cpt-post"> <div class="td-module-container td-category-pos-"> <div class="td-image-container"> <div class="td-module-thumb"><a href="http://instadsc.in/index.php/2023/12/09/w4-games-raises-15m-to-drive-video-game-development-with-godot-engine/" rel="bookmark" class="td-image-wrap " title="W4 Games raises $15M to drive video game development with Godot Engine" ><span class="entry-thumb td-thumb-css" data-type="css_image" data-img-url="http://instadsc.in/wp-content/uploads/2023/12/9185-w4-games-raises-15m-to-drive-video-game-development-with-godot-engine-218x150.jpeg" ></span></a></div> </div> <div class="td-module-meta-info"> <h3 class="entry-title td-module-title"><a href="http://instadsc.in/index.php/2023/12/09/w4-games-raises-15m-to-drive-video-game-development-with-godot-engine/" rel="bookmark" title="W4 Games raises $15M to drive video game development with Godot Engine">W4 Games raises $15M to drive video game development with Godot Engine</a></h3> <div class="td-editor-date"> <span class="td-author-date"> <span class="td-post-date"><time class="entry-date updated td-module-date" datetime="2023-12-09T11:43:09+00:00" >December 9, 2023</time></span> </span> </div> </div> </div> </div> <div class="td_module_flex td_module_flex_1 td_module_wrap td-animation-stack td-cpt-post"> <div class="td-module-container td-category-pos-"> <div class="td-image-container"> <div class="td-module-thumb"><a href="http://instadsc.in/index.php/2023/12/09/apple-cuts-off-beeper-minis-access/" rel="bookmark" class="td-image-wrap " title="Apple cuts off Beeper Mini’s access" ><span class="entry-thumb td-thumb-css" data-type="css_image" data-img-url="http://instadsc.in/wp-content/uploads/2023/12/9187-apple-cuts-off-beeper-minis-access-218x150.jpg" ></span></a></div> </div> <div class="td-module-meta-info"> <h3 class="entry-title td-module-title"><a href="http://instadsc.in/index.php/2023/12/09/apple-cuts-off-beeper-minis-access/" rel="bookmark" title="Apple cuts off Beeper Mini’s access">Apple cuts off Beeper Mini’s access</a></h3> <div class="td-editor-date"> <span class="td-author-date"> <span class="td-post-date"><time class="entry-date updated td-module-date" datetime="2023-12-09T11:43:08+00:00" >December 9, 2023</time></span> </span> </div> </div> </div> </div> <div class="td_module_flex td_module_flex_1 td_module_wrap td-animation-stack td-cpt-post"> <div class="td-module-container td-category-pos-"> <div class="td-image-container"> <div class="td-module-thumb"><a href="http://instadsc.in/index.php/2023/12/09/openbao-foss-fork-of-hashicorp-vault/" rel="bookmark" class="td-image-wrap " title="OpenBao – FOSS Fork of HashiCorp Vault" ><span class="entry-thumb td-thumb-css" data-type="css_image" data-img-url="http://instadsc.in/wp-content/uploads/2023/12/9189-openbao-foss-fork-of-hashicorp-vault-218x150.jpg" ></span></a></div> </div> <div class="td-module-meta-info"> <h3 class="entry-title td-module-title"><a href="http://instadsc.in/index.php/2023/12/09/openbao-foss-fork-of-hashicorp-vault/" rel="bookmark" title="OpenBao – FOSS Fork of HashiCorp Vault">OpenBao – FOSS Fork of HashiCorp Vault</a></h3> <div class="td-editor-date"> <span class="td-author-date"> <span class="td-post-date"><time class="entry-date updated td-module-date" datetime="2023-12-09T11:43:07+00:00" >December 9, 2023</time></span> </span> </div> </div> </div> </div> </div></div></div></div></div><div class="vc_column_inner tdi_147 wpb_column vc_column_container tdc-inner-column td-pb-span4"> <style scoped> /* custom css */ .tdi_147{ vertical-align: baseline; }.tdi_147 .vc_column-inner > .wpb_wrapper, .tdi_147 .vc_column-inner > .wpb_wrapper .tdc-elements{ display: block; }.tdi_147 .vc_column-inner > .wpb_wrapper .tdc-elements{ width: 100%; } </style><div class="vc_column-inner"><div class="wpb_wrapper"><div class="td_block_wrap td_block_popular_categories tdi_148 widget widget_categories td-pb-border-top td_block_template_2" data-td-block-uid="tdi_148" > <style> .td-theme-wrap .tdi_148 .td-block-title > *, .td-theme-wrap .tdi_148 .td-pulldown-filter-link:hover, .td-theme-wrap .tdi_148 .td-subcat-item a:hover, .td-theme-wrap .tdi_148 .td-subcat-item .td-cur-simple-item, .td-theme-wrap .tdi_148 .td-subcat-dropdown:hover .td-subcat-more span, .td-theme-wrap .tdi_148 .td-subcat-dropdown:hover .td-subcat-more i { color: #ffffff; } .td-theme-wrap .tdi_148 .td-subcat-dropdown ul:after { background-color: #ffffff; } .td-theme-wrap .tdi_148 .td_module_wrap:hover .entry-title a, .td-theme-wrap .tdi_148 .td_quote_on_blocks, .td-theme-wrap .tdi_148 .td-opacity-cat .td-post-category:hover, .td-theme-wrap .tdi_148 .td-opacity-read .td-read-more a:hover, .td-theme-wrap .tdi_148 .td-opacity-author .td-post-author-name a:hover, .td-theme-wrap .tdi_148 .td-instagram-user a { color: #ffffff; } .td-theme-wrap .tdi_148 .td-next-prev-wrap a:hover, .td-theme-wrap .tdi_148 .td-load-more-wrap a:hover { background-color: #ffffff; border-color: #ffffff; } .td-theme-wrap .tdi_148 .td-read-more a, .td-theme-wrap .tdi_148 .td-weather-information:before, .td-theme-wrap .tdi_148 .td-weather-week:before, .td-theme-wrap .tdi_148 .td-exchange-header:before, .td-theme-wrap .td-footer-wrapper .tdi_148 .td-post-category, .td-theme-wrap .tdi_148 .td-post-category:hover { background-color: #ffffff; } /* inline tdc_css att */ /* portrait */ @media (min-width: 768px) and (max-width: 1018px) { .tdi_148{ margin-bottom:20px !important; } } </style> <style> /* custom css */ .td_block_popular_categories{ padding-bottom: 0; }.tdi_148 .td-cat-name{ color: #ffffff; }.tdi_148 .td-cat-no{ color: #ffffff; }.tdi_148 li:hover .td-cat-name{ color: #4db2ec; }.tdi_148 li:hover .td-cat-no{ color: #4db2ec; }.tdi_148 .td-block-title a, .tdi_148 .td-block-title span{ font-size:18px !important; } /* portrait */ @media (min-width: 768px) and (max-width: 1018px){ .tdi_148 li{ font-size:13px !important;line-height:26px !important; } } </style><div class="td-block-title-wrap"><h4 class="td-block-title"><span class="td-pulldown-size">POPULAR CATEGORY</span></h4></div><ul class="td-pb-padding-side"><li><a href="http://instadsc.in/index.php/category/racing/"><span class="td-cat-name">Racing</span><span class="td-cat-no">20</span></a></li><li><a href="http://instadsc.in/index.php/category/gadgets/"><span class="td-cat-name">Gadgets</span><span class="td-cat-no">16</span></a></li><li><a href="http://instadsc.in/index.php/category/sport/"><span class="td-cat-name">Sport</span><span class="td-cat-no">15</span></a></li><li><a href="http://instadsc.in/index.php/category/reviews/"><span class="td-cat-name">Reviews</span><span class="td-cat-no">15</span></a></li><li><a href="http://instadsc.in/index.php/category/lifestyle/recipes/"><span class="td-cat-name">Recipes</span><span class="td-cat-no">15</span></a></li><li><a href="http://instadsc.in/index.php/category/fashion/street-fashion/"><span class="td-cat-name">Street Fashion</span><span class="td-cat-no">15</span></a></li><li><a href="http://instadsc.in/index.php/category/fashion/new-look/"><span class="td-cat-name">New Look</span><span class="td-cat-no">15</span></a></li></ul></div></div></div></div></div><div class="vc_row_inner tdi_150 vc_row vc_inner wpb_row td-pb-row" > <style scoped> /* custom css */ .tdi_150{ position: relative !important; top: 0; transform: none; -webkit-transform: none; }.tdi_150, .tdi_150 .tdc-inner-columns{ display: block; }.tdi_150 .tdc-inner-columns{ width: 100%; } </style><div class="vc_column_inner tdi_152 wpb_column vc_column_container tdc-inner-column td-pb-span12"> <style scoped> /* custom css */ .tdi_152{ vertical-align: baseline; }.tdi_152 .vc_column-inner > .wpb_wrapper, .tdi_152 .vc_column-inner > .wpb_wrapper .tdc-elements{ display: block; }.tdi_152 .vc_column-inner > .wpb_wrapper .tdc-elements{ width: 100%; } /* inline tdc_css att */ /* portrait */ @media (min-width: 768px) and (max-width: 1018px) { .tdi_152{ margin-bottom:0px !important; } } </style><div class="vc_column-inner"><div class="wpb_wrapper"><div class="wpb_wrapper td_block_separator td_block_wrap vc_separator tdi_154 td_separator_solid td_separator_center"><span style="border-color:rgba(255,255,255,0.1);border-width:1px;width:80%;"></span> <style scoped> /* inline tdc_css att */ /* portrait */ @media (min-width: 768px) and (max-width: 1018px) { .tdi_154{ margin-bottom:20px !important; } } </style></div></div></div></div></div><div class="vc_row_inner tdi_156 vc_row vc_inner wpb_row td-pb-row" > <style scoped> /* custom css */ .tdi_156{ position: relative !important; top: 0; transform: none; -webkit-transform: none; }.tdi_156, .tdi_156 .tdc-inner-columns{ display: block; }.tdi_156 .tdc-inner-columns{ width: 100%; } /* inline tdc_css att */ .tdi_156{ padding-bottom:30px !important; } .tdi_156 .td_block_wrap{ text-align:left } /* portrait */ @media (min-width: 768px) and (max-width: 1018px) { .tdi_156{ padding-bottom:20px !important; } } </style><div class="vc_column_inner tdi_158 wpb_column vc_column_container tdc-inner-column td-pb-span4"> <style scoped> /* custom css */ .tdi_158{ vertical-align: baseline; }.tdi_158 .vc_column-inner > .wpb_wrapper, .tdi_158 .vc_column-inner > .wpb_wrapper .tdc-elements{ display: block; }.tdi_158 .vc_column-inner > .wpb_wrapper .tdc-elements{ width: 100%; } /* inline tdc_css att */ .tdi_158{ width:25% !important; } /* phone */ @media (max-width: 767px) { .tdi_158{ margin-bottom:50px !important; width:100% !important; } } </style><div class="vc_column-inner"><div class="wpb_wrapper"><div class="td_block_wrap tdb_header_logo tdi_159 td-pb-border-top td_block_template_1 tdb-header-align" data-td-block-uid="tdi_159" > <style> /* inline tdc_css att */ .tdi_159{ margin-top:37px !important; } /* portrait */ @media (min-width: 768px) and (max-width: 1018px) { .tdi_159{ margin-top:44px !important; } } /* phone */ @media (max-width: 767px) { .tdi_159{ margin-top:0px !important; } } </style> <style> /* custom css */ .tdi_159 .tdb-logo-a, .tdi_159 h1{ flex-direction: row; align-items: flex-start; justify-content: center; }.tdi_159 .tdb-logo-svg-wrap{ display: block; }.tdi_159 .tdb-logo-svg-wrap + .tdb-logo-img-wrap{ display: none; }.tdi_159 .tdb-logo-img-wrap{ display: block; }.tdi_159 .tdb-logo-text-tagline{ margin-top: 2px; margin-left: 0; display: block; }.tdi_159 .tdb-logo-text-title{ display: block; }.tdi_159 .tdb-logo-text-wrap{ flex-direction: column; align-items: flex-start; }.tdi_159 .tdb-logo-icon{ top: 0px; display: block; } </style><div class="tdb-block-inner td-fix-index"><a class="tdb-logo-a" href="http://instadsc.in/"><span class="tdb-logo-img-wrap"><img class="tdb-logo-img td-retina-data" data-retina="http://instadsc.in/wp-content/uploads/2023/03/np10blue-white-retina.png" src="http://instadsc.in/wp-content/uploads/2023/03/np10blue-white.png" alt="Logo" title="" width="272" height="90" /></span></a></div></div> <!-- ./block --></div></div></div><div class="vc_column_inner tdi_161 wpb_column vc_column_container tdc-inner-column td-pb-span4"> <style scoped> /* custom css */ .tdi_161{ vertical-align: baseline; }.tdi_161 .vc_column-inner > .wpb_wrapper, .tdi_161 .vc_column-inner > .wpb_wrapper .tdc-elements{ display: block; }.tdi_161 .vc_column-inner > .wpb_wrapper .tdc-elements{ width: 100%; } /* inline tdc_css att */ .tdi_161{ width:41.66666667% !important; } /* phone */ @media (max-width: 767px) { .tdi_161{ margin-bottom:50px !important; width:100% !important; justify-content:center !important; text-align:center !important; } } </style><div class="vc_column-inner"><div class="wpb_wrapper"><div class="tdm_block td_block_wrap tdm_block_column_title tdi_162 tdm-content-horiz-left td-pb-border-top td_block_template_1" data-td-block-uid="tdi_162" > <style> /* inline tdc_css att */ /* phone */ @media (max-width: 767px) { .tdi_162{ justify-content:center !important; text-align:center !important; } } </style> <style> /* custom css */ .tdm_block_column_title{ margin-bottom: 0; display: inline-block; width: 100%; } </style><div class="td-block-row"><div class="td-block-span12 tdm-col"> <style> body .tdi_163 .tdm-title{ color: #ffffff; }.tdi_163 .tdm-title{ font-size:18px !important;line-height:1 !important;font-weight:700 !important; } </style><div class="tds-title tds-title1 td-fix-index tdi_163"><h3 class="tdm-title tdm-title-md">ABOUT US</h3></div></div></div></div><div class="tdm_block td_block_wrap tdm_block_inline_text tdi_164 td-pb-border-top td_block_template_1" data-td-block-uid="tdi_164" > <style> /* inline tdc_css att */ /* phone */ @media (max-width: 767px) { .tdi_164{ justify-content:center !important; text-align:center !important; } } </style> <style> /* custom css */ .tdm_block.tdm_block_inline_text{ margin-bottom: 0; vertical-align: top; }.tdm_block.tdm_block_inline_text .tdm-descr{ margin-bottom: 0; -webkit-transform: translateZ(0); transform: translateZ(0); }.tdc-row-content-vert-center .tdm-inline-text-yes{ vertical-align: middle; }.tdc-row-content-vert-bottom .tdm-inline-text-yes{ vertical-align: bottom; }.tdi_164{ text-align: left !important; }.tdi_164 .tdm-descr{ color: #eaeaea; font-size:14px !important;line-height:1.6 !important; } /* portrait */ @media (min-width: 768px) and (max-width: 1018px){ .tdi_164 .tdm-descr{ font-size:13px !important;line-height:1.6 !important; } } </style><p class="tdm-descr">Newspaper is your news, entertainment, music fashion website. We provide you with the latest breaking news and videos straight from the entertainment industry.</p></div><div class="tdm_block td_block_wrap tdm_block_inline_text tdi_165 td-pb-border-top td_block_template_1" data-td-block-uid="tdi_165" > <style> /* inline tdc_css att */ .tdi_165{ margin-top:21px !important; } /* phone */ @media (max-width: 767px) { .tdi_165{ justify-content:center !important; text-align:center !important; } } </style> <style> /* custom css */ .tdi_165{ text-align: left !important; }.tdi_165 .tdm-descr{ color: #eaeaea; font-size:14px !important;line-height:1.6 !important; }.tdi_165 .tdm-descr a{ color: #1aa4ce; } /* portrait */ @media (min-width: 768px) and (max-width: 1018px){ .tdi_165 .tdm-descr{ font-size:13px !important;line-height:1.6 !important; } } </style><p class="tdm-descr">Contact us: <a href="mailto:contact@yoursite.com">contact@yoursite.com</a></p></div></div></div></div><div class="vc_column_inner tdi_167 wpb_column vc_column_container tdc-inner-column td-pb-span4"> <style scoped> /* custom css */ .tdi_167{ vertical-align: baseline; }.tdi_167 .vc_column-inner > .wpb_wrapper, .tdi_167 .vc_column-inner > .wpb_wrapper .tdc-elements{ display: block; }.tdi_167 .vc_column-inner > .wpb_wrapper .tdc-elements{ width: 100%; } /* inline tdc_css att */ /* phone */ @media (max-width: 767px) { .tdi_167{ justify-content:center !important; text-align:center !important; } } </style><div class="vc_column-inner"><div class="wpb_wrapper"><div class="tdm_block td_block_wrap tdm_block_column_title tdi_168 tdm-content-horiz-left td-pb-border-top td_block_template_1" data-td-block-uid="tdi_168" > <style> /* inline tdc_css att */ /* phone */ @media (max-width: 767px) { .tdi_168{ justify-content:center !important; text-align:center !important; } } </style><div class="td-block-row"><div class="td-block-span12 tdm-col"> <style> body .tdi_169 .tdm-title{ color: #ffffff; }.tdi_169 .tdm-title{ font-size:18px !important;line-height:1 !important;font-weight:700 !important; } </style><div class="tds-title tds-title1 td-fix-index tdi_169"><h3 class="tdm-title tdm-title-md">FOLLOW US</h3></div></div></div></div><div class="tdm_block td_block_wrap tdm_block_socials tdi_170 tdm-content-horiz-left td-pb-border-top td_block_template_1" data-td-block-uid="tdi_170" > <style> /* inline tdc_css att */ /* phone */ @media (max-width: 767px) { .tdi_170{ justify-content:center !important; text-align:center !important; } } </style> <style> .tdi_171 .tdm-social-item i{ font-size: 14px; vertical-align: middle; line-height: 39.2px; }.tdi_171 .tdm-social-item i.td-icon-twitter, .tdi_171 .tdm-social-item i.td-icon-linkedin, .tdi_171 .tdm-social-item i.td-icon-pinterest, .tdi_171 .tdm-social-item i.td-icon-blogger, .tdi_171 .tdm-social-item i.td-icon-vimeo{ font-size: 11.2px; }.tdi_171 .tdm-social-item{ width: 39.2px; height: 39.2px; margin: 5px 10px 5px 0; background: rgba(255,255,255,0.03); }.tdi_171 .tdm-social-item-wrap:last-child .tdm-social-item{ margin-right: 0 !important; }.tdi_171 .tdm-social-item i, .tds-team-member2 .tdi_171.tds-social4 .tdm-social-item i{ color: #ffffff; }.tdi_171 .tdm-social-item-wrap:hover i, body .tds-team-member2 .tdi_171.tds-social4 .tdm-social-item-wrap:hover i{ color: #4db2ec; }body .tdi_171 .tdm-social-item{ border: 1px solid rgba(255,255,255,0.03); }.tdi_171 .tdm-social-text{ display: none; margin-left: 2px; margin-right: 18px; } /* landscape */ @media (min-width: 1019px) and (max-width: 1140px){ body .tdi_171 .tdm-social-item{ border: 1px solid rgba(255,255,255,0.03); } } /* portrait */ @media (min-width: 768px) and (max-width: 1018px){ .tdi_171 .tdm-social-item{ width: 35px; height: 35px; }.tdi_171 .tdm-social-item i{ line-height: 35px; }body .tdi_171 .tdm-social-item{ border: 1px solid rgba(255,255,255,0.03); } } /* phone */ @media (max-width: 767px){ body .tdi_171 .tdm-social-item{ border: 1px solid rgba(255,255,255,0.03); } } </style><div class="tdm-social-wrapper tds-social4 tdi_171"><div class="tdm-social-item-wrap"><a href="#" title="Blogger" class="tdm-social-item"><i class="td-icon-font td-icon-blogger"></i></a><a href="#" class="tdm-social-text">Blogger</a></div><div class="tdm-social-item-wrap"><a href="#" title="Facebook" class="tdm-social-item"><i class="td-icon-font td-icon-facebook"></i></a><a href="#" class="tdm-social-text">Facebook</a></div><div class="tdm-social-item-wrap"><a href="#" title="Flickr" class="tdm-social-item"><i class="td-icon-font td-icon-flickr"></i></a><a href="#" class="tdm-social-text">Flickr</a></div><div class="tdm-social-item-wrap"><a href="#" title="Instagram" class="tdm-social-item"><i class="td-icon-font td-icon-instagram"></i></a><a href="#" class="tdm-social-text">Instagram</a></div><div class="tdm-social-item-wrap"><a href="#" title="VKontakte" class="tdm-social-item"><i class="td-icon-font td-icon-vk"></i></a><a href="#" class="tdm-social-text">VKontakte</a></div></div></div></div></div></div></div></div></div></div></div><div id="tdi_172" class="tdc-row stretch_row"><div class="vc_row tdi_173 wpb_row td-pb-row tdc-element-style" > <style scoped> /* custom css */ .tdi_173, .tdi_173 .tdc-columns{ min-height: 0; }.tdi_173, .tdi_173 .tdc-columns{ display: block; }.tdi_173 .tdc-columns{ width: 100%; } /* inline tdc_css att */ .tdi_173{ position:relative; } .tdi_173 .td_block_wrap{ text-align:left } /* phone */ @media (max-width: 767px) { .tdi_173{ padding-top:6px !important; padding-bottom:6px !important; } } </style> <div class="tdi_172_rand_style td-element-style" ><style> .tdi_172_rand_style{ background-color:#0d0d0d !important; } </style></div><div class="vc_column tdi_175 wpb_column vc_column_container tdc-column td-pb-span6"> <style scoped> /* custom css */ .tdi_175{ vertical-align: baseline; }.tdi_175 > .wpb_wrapper, .tdi_175 > .wpb_wrapper > .tdc-elements{ display: block; }.tdi_175 > .wpb_wrapper > .tdc-elements{ width: 100%; }.tdi_175 > .wpb_wrapper > .vc_row_inner{ width: auto; }.tdi_175 > .wpb_wrapper{ width: auto; height: auto; } </style><div class="wpb_wrapper"><div class="tdm_block td_block_wrap tdm_block_inline_text tdi_176 td-pb-border-top td_block_template_1" data-td-block-uid="tdi_176" > <style> /* inline tdc_css att */ .tdi_176{ margin-top:2px !important; margin-bottom:0px !important; padding-top:8px !important; padding-bottom:8px !important; } /* phone */ @media (max-width: 767px) { .tdi_176{ margin-top:0px !important; justify-content:center !important; text-align:center !important; } } </style> <style> /* custom css */ .tdi_176{ text-align: left !important; }.tdi_176 .tdm-descr{ color: #cccccc; font-size:12px !important;line-height:21px !important; } </style><p class="tdm-descr">© Newspaper WordPress Theme by TagDiv</p></div></div></div><div class="vc_column tdi_178 wpb_column vc_column_container tdc-column td-pb-span6"> <style scoped> /* custom css */ .tdi_178{ vertical-align: baseline; }.tdi_178 > .wpb_wrapper, .tdi_178 > .wpb_wrapper > .tdc-elements{ display: block; }.tdi_178 > .wpb_wrapper > .tdc-elements{ width: 100%; }.tdi_178 > .wpb_wrapper > .vc_row_inner{ width: auto; }.tdi_178 > .wpb_wrapper{ width: auto; height: auto; } /* inline tdc_css att */ .tdi_178{ justify-content:flex-end !important; text-align:right !important; } /* phone */ @media (max-width: 767px) { .tdi_178{ justify-content:center !important; text-align:center !important; } } </style><div class="wpb_wrapper"><div class="td_block_wrap td_block_list_menu tdi_179 td-pb-border-top td_block_template_1 widget" data-td-block-uid="tdi_179" > <style> /* inline tdc_css att */ .tdi_179{ margin-bottom:0px !important; padding-top:8px !important; padding-bottom:8px !important; } /* desktop */ @media(min-width: 1141px) { .tdi_179 { display:inline-table !important; } } /* phone */ @media (max-width: 767px) { .tdi_179{ margin-left:16px !important; justify-content:center !important; text-align:center !important; display:inline-table !important; } } /* portrait */ @media (min-width: 768px) and (max-width: 1018px) { .tdi_179{ display:inline-table !important; } } /* landscape */ @media (min-width: 1019px) and (max-width: 1140px) { .tdi_179{ display:inline-table !important; } } </style> <style> /* custom css */ .td_block_list_menu ul{ flex-wrap: wrap; margin-left: 12px; }.td_block_list_menu ul li{ margin-left: 0; }.td_block_list_menu .sub-menu{ padding-left: 22px; }.td_block_list_menu .sub-menu li{ font-size: 13px; }.td_block_list_menu li.current-menu-item > a, .td_block_list_menu li.current-menu-ancestor > a, .td_block_list_menu li.current-category-ancestor > a{ color: #4db2ec; }.tdi_179 li{ display: inline-block; font-size:12px !important;line-height:21px !important; }.tdi_179 .menu{ display: flex; }.tdi_179 .sub-menu{ display: none; }.tdi_179 ul{ margin: 0px; text-align: left; justify-content: flex-start; }.tdi_179 ul li{ margin-right: 16px; }.tdi_179 ul li:last-child{ margin-right: 0; }.tdi_179 a{ color: #cccccc; }body .tdi_179 li.current-menu-item > a, body .tdi_179 li.current-menu-ancestor > a, body .tdi_179 li.current-category-ancestor > a, body .tdi_179 a:hover{ color: #1aa4ce; } </style><div class="td-block-title-wrap"></div><div id=tdi_179 class="td_block_inner td-fix-index"><div class="menu-main-container"><ul id="menu-main" class="menu"><li id="menu-item-1222" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1222"><a href="http://instadsc.in/index.php/home-default/">Home Default</a></li> <li id="menu-item-1155" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-1155"><a href="#">Features</a> <ul class="sub-menu"> <li id="menu-item-1163" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1163"><a href="#">Post Styles</a></li> <li id="menu-item-1165" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1165"><a href="#">Post Video</a></li> <li id="menu-item-1174" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1174"><a href="#">Post Gallery</a></li> <li id="menu-item-1175" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1175"><a href="#">Post Ajax</a></li> <li id="menu-item-1176" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1176"><a href="#">Sidebar</a></li> <li id="menu-item-1177" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1177"><a href="#">Review</a></li> <li id="menu-item-1205" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1205"><a href="http://instadsc.in/index.php/shortcodes/">Shortcodes</a></li> <li id="menu-item-1164" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-1164"><a href="#">Category Layouts</a> <ul class="sub-menu"> <li id="menu-item-1180" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-1180"><a href="http://instadsc.in/index.php/category/videos/">Videos</a></li> <li id="menu-item-1181" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-1181"><a href="http://instadsc.in/index.php/category/sports/">Sports</a></li> </ul> </li> <li id="menu-item-1188" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-1188"><a href="#">Pages</a> <ul class="sub-menu"> <li id="menu-item-1213" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1213"><a href="http://instadsc.in/index.php/our-amazing-team/">Team Template</a></li> <li id="menu-item-1215" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1215"><a href="http://instadsc.in/index.php/contact/">Contact</a></li> <li id="menu-item-1214" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1214"><a href="http://instadsc.in/index.php/contact-ninja/">Contact (Ninja)</a></li> <li id="menu-item-1189" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1189"><a href="http://newsmax.themeruby.com/default/404">404 Template</a></li> <li id="menu-item-1190" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1190"><a href="http://newsmax.themeruby.com/default/?s=a">Search Page</a></li> <li id="menu-item-1191" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1191"><a href="http://newsmax.themeruby.com/default/tag/sport/">Tag Page</a></li> <li id="menu-item-1192" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1192"><a href="http://newsmax.themeruby.com/default/2017/03/">Archive Page</a></li> <li id="menu-item-1216" class="menu-item menu-item-type-post_type menu-item-object-page current_page_parent menu-item-1216"><a href="http://instadsc.in/index.php/blog/">Blog</a></li> </ul> </li> <li id="menu-item-1219" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1219"><a href="http://instadsc.in/index.php/shop/">WooCommerce</a></li> <li id="menu-item-1193" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-1193"><a href="#">Child Menu</a> <ul class="sub-menu"> <li id="menu-item-1194" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-1194"><a href="#">Sub-child Menu</a> <ul class="sub-menu"> <li id="menu-item-1195" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1195"><a href="#">Sub-child Menu</a></li> <li id="menu-item-1198" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1198"><a href="#">Sub-child Menu</a></li> <li id="menu-item-1199" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1199"><a href="#">Sub-child Menu</a></li> </ul> </li> <li id="menu-item-1196" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1196"><a href="#">Sub-child Menu</a></li> <li id="menu-item-1197" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1197"><a href="#">Sub-child Menu</a></li> </ul> </li> </ul> </li> <li id="menu-item-1158" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-1158"><a href="http://instadsc.in/index.php/category/videos/">Videos</a></li> <li id="menu-item-1221" class="menu-item menu-item-type-post_type menu-item-object-page current_page_parent menu-item-1221"><a href="http://instadsc.in/index.php/blog/">Blog</a></li> <li id="menu-item-1159" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-1159"><a href="http://instadsc.in/index.php/category/sports/">Sports</a></li> </ul></div></div></div></div></div></div></div></div></div> </div> </div> </div><!--close td-outer-wrap--> <!-- Theme: Newspaper by tagDiv.com 2022 Version: 12.1 (rara) Deploy mode: deploy uid: 65747cf464f2c --> <script type="text/javascript" src="http://instadsc.in/wp-content/plugins/newsmax-core/assets/script.js?ver=4.2" id="newsmax_ruby_core_script-js"></script> <script type="text/javascript" src="http://instadsc.in/wp-content/plugins/contact-form-7/includes/swv/js/index.js?ver=5.7.2" id="swv-js"></script> <script type="text/javascript" id="contact-form-7-js-extra"> /* <![CDATA[ */ var wpcf7 = {"api":{"root":"http:\/\/instadsc.in\/index.php\/wp-json\/","namespace":"contact-form-7\/v1"}}; /* ]]> */ </script> <script type="text/javascript" src="http://instadsc.in/wp-content/plugins/contact-form-7/includes/js/index.js?ver=5.7.2" id="contact-form-7-js"></script> <script type="text/javascript" src="http://instadsc.in/wp-includes/js/underscore.min.js?ver=1.13.4" id="underscore-js"></script> <script type="text/javascript" src="http://instadsc.in/wp-content/plugins/td-cloud-library/assets/js/js_posts_autoload.min.js?ver=87b3292f51aec51c00e6ce7db9b73ed1" id="tdb_js_posts_autoload-js"></script> <script type="text/javascript" src="http://instadsc.in/wp-content/plugins/td-composer/legacy/Newspaper/js/tagdiv_theme.min.js?ver=12.1" id="td-site-min-js"></script> <script type="text/javascript" src="http://instadsc.in/wp-includes/js/comment-reply.min.js?ver=6.4.2" id="comment-reply-js" async="async" data-wp-strategy="async"></script> <script type="text/javascript" id="tds_js_files_for_front-js-extra"> /* <![CDATA[ */ var tds_js_globals = {"wpRestNonce":"f320e09eba","wpRestUrl":"http:\/\/instadsc.in\/index.php\/wp-json\/","permalinkStructure":"\/index.php\/%year%\/%monthnum%\/%day%\/%postname%\/"}; /* ]]> */ </script> <script type="text/javascript" src="http://instadsc.in/wp-content/plugins/td-subscription/assets/js/js_files_for_front.min.js?ver=1.3.3" id="tds_js_files_for_front-js"></script> <script type="text/javascript" src="http://instadsc.in/wp-includes/js/hoverIntent.min.js?ver=1.10.2" id="hoverIntent-js"></script> <script type="text/javascript" id="megamenu-js-extra"> /* <![CDATA[ */ var megamenu = {"timeout":"300","interval":"100"}; /* ]]> */ </script> <script type="text/javascript" src="http://instadsc.in/wp-content/plugins/megamenu/js/maxmegamenu.js?ver=3.1" id="megamenu-js"></script> <script type="text/javascript" src="http://instadsc.in/wp-content/plugins/megamenu-pro/assets/public.js?ver=2.2.3" id="megamenu-pro-js"></script> <script type="text/javascript" src="http://instadsc.in/wp-content/plugins/td-cloud-library/assets/js/js_files_for_front.min.js?ver=87b3292f51aec51c00e6ce7db9b73ed1" id="tdb_js_files_for_front-js"></script> <!-- JS generated by theme --> <script> jQuery().ready(function () { var blockClass = '.tdi_36'; jQuery(blockClass + '.tdb-horiz-menu-singleline > .menu-item-has-children a').click(function (e) { e.preventDefault(); }) }); /* global jQuery:{} */ jQuery().ready(function () { var tdbMenuItem = new tdbMenu.item(); tdbMenuItem.blockUid = 'tdi_55'; tdbMenuItem.jqueryObj = jQuery('.tdi_55'); tdbMenuItem.isMegaMenuFull = true; tdbMenu.addItem(tdbMenuItem); }); jQuery().ready(function () { var tdbSearchItem = new tdbSearch.item(); //block unique ID tdbSearchItem.blockUid = 'tdi_70'; tdbSearchItem.blockAtts = '{"inline":"yes","toggle_txt_pos":"after","form_align":"content-horiz-right","results_msg_align":"content-horiz-center","image_floated":"float_left","image_width":"30","image_size":"td_324x400","show_cat":"none","show_btn":"none","show_date":"","show_review":"","show_com":"none","show_excerpt":"none","show_author":"none","art_title":"0 0 2px 0","all_modules_space":"20","tdicon":"td-icon-magnifier-big-rounded","icon_size":"eyJhbGwiOiIyMCIsInBvcnRyYWl0IjoiMTgifQ==","tdc_css":"eyJhbGwiOnsiZGlzcGxheSI6IiJ9LCJwb3J0cmFpdCI6eyJtYXJnaW4tdG9wIjoiMSIsImRpc3BsYXkiOiIifSwicG9ydHJhaXRfbWF4X3dpZHRoIjoxMDE4LCJwb3J0cmFpdF9taW5fd2lkdGgiOjc2OH0=","modules_on_row":"eyJhbGwiOiI1MCUiLCJwb3J0cmFpdCI6IjUwJSIsImxhbmRzY2FwZSI6IjUwJSJ9","meta_info_horiz":"content-horiz-left","form_width":"600","input_border":"0 0 1px 0","modules_divider":"","form_padding":"eyJwb3J0cmFpdCI6IjIwcHggMjBweCAyMHB4IiwiYWxsIjoiMzBweCJ9","arrow_color":"#ffffff","btn_bg_h":"rgba(0,0,0,0)","btn_tdicon":"td-icon-menu-right","btn_icon_pos":"after","btn_icon_size":"7","btn_icon_space":"8","f_title_font_family":"","f_cat_font_family":"","f_cat_font_transform":"uppercase","f_title_font_weight":"","f_title_font_transform":"","f_title_font_size":"13","title_txt_hover":"#4db2ec","results_limit":"6","float_block":"yes","icon_color":"#000000","results_border":"0 0 1px 0","f_title_font_line_height":"1.4","btn_color":"#000000","btn_color_h":"#4db2ec","all_underline_color":"","results_msg_color_h":"#4db2ec","image_height":"100","meta_padding":"3px 0 0 16px","modules_gap":"20","mc1_tl":"12","show_form":"yes","f_meta_font_weight":"","h_effect":"","results_msg_padding":"10px 0","f_results_msg_font_style":"normal","video_icon":"24","modules_divider_color":"","modules_border_color":"","btn_padding":"0","form_border":"0","form_shadow_shadow_offset_vertical":"3","results_padding":"0 30px 30px","btn_bg":"rgba(0,0,0,0)","icon_padding":"eyJhbGwiOjIuNCwicG9ydHJhaXQiOiIyLjYifQ==","block_type":"tdb_header_search","post_type":"","disable_trigger":"","show_results":"yes","separator":"","disable_live_search":"","exclude_pages":"","exclude_posts":"","search_section_header":"","results_section_1_title":"","results_section_1_taxonomies":"","results_section_1_level":"","results_section_2_title":"","results_section_2_taxonomies":"","results_section_2_level":"","results_section_3_title":"","results_section_3_taxonomies":"","results_section_3_level":"","results_section_search_query_terms":"","results_section_search_query_terms_title":"","results_section_search_query_terms_taxonomies":"","sec_title_space":"","sec_title_color":"","tax_space":"","tax_title_color":"","tax_title_color_h":"","f_sec_title_font_header":"","f_sec_title_font_title":"Section title text","f_sec_title_font_settings":"","f_sec_title_font_family":"","f_sec_title_font_size":"","f_sec_title_font_line_height":"","f_sec_title_font_style":"","f_sec_title_font_weight":"","f_sec_title_font_transform":"","f_sec_title_font_spacing":"","f_sec_title_":"","f_tax_title_font_title":"Taxonomy title text","f_tax_title_font_settings":"","f_tax_title_font_family":"","f_tax_title_font_size":"","f_tax_title_font_line_height":"","f_tax_title_font_style":"","f_tax_title_font_weight":"","f_tax_title_font_transform":"","f_tax_title_font_spacing":"","f_tax_title_":"","toggle_txt":"","toggle_txt_align":"0","toggle_txt_space":"","toggle_horiz_align":"content-horiz-left","form_offset":"","form_offset_left":"","form_content_width":"","form_align_screen":"","input_placeholder":"","placeholder_travel":"0","input_padding":"","input_radius":"","btn_text":"Search","btn_icon_align":"0","btn_margin":"","btn_border":"","btn_radius":"","results_msg_border":"","mc1_title_tag":"","mc1_el":"","m_padding":"","modules_border_size":"","modules_border_style":"","image_alignment":"50","image_radius":"","hide_image":"","show_vid_t":"block","vid_t_margin":"","vid_t_padding":"","vid_t_color":"","vid_t_bg_color":"","f_vid_time_font_header":"","f_vid_time_font_title":"Video duration text","f_vid_time_font_settings":"","f_vid_time_font_family":"","f_vid_time_font_size":"","f_vid_time_font_line_height":"","f_vid_time_font_style":"","f_vid_time_font_weight":"","f_vid_time_font_transform":"","f_vid_time_font_spacing":"","f_vid_time_":"","excl_show":"inline-block","excl_txt":"","excl_margin":"","excl_padd":"","all_excl_border":"","all_excl_border_style":"solid","excl_radius":"","excl_color":"","excl_color_h":"","excl_bg":"","excl_bg_h":"","all_excl_border_color":"","excl_border_color_h":"","f_excl_font_header":"","f_excl_font_title":"Label text","f_excl_font_settings":"","f_excl_font_family":"","f_excl_font_size":"","f_excl_font_line_height":"","f_excl_font_style":"","f_excl_font_weight":"","f_excl_font_transform":"","f_excl_font_spacing":"","f_excl_":"","meta_info_align":"","meta_width":"","meta_margin":"","meta_info_border_size":"","meta_info_border_style":"","meta_info_border_color":"#eaeaea","art_btn":"","modules_category":"","modules_category_margin":"","modules_category_padding":"","modules_cat_border":"","modules_category_radius":"0","modules_extra_cat":"","author_photo":"","author_photo_size":"","author_photo_space":"","author_photo_radius":"","show_modified_date":"","time_ago":"","time_ago_add_txt":"ago","time_ago_txt_pos":"","review_space":"","review_size":"2.5","review_distance":"","art_excerpt":"","excerpt_col":"1","excerpt_gap":"","excerpt_middle":"","btn_title":"","btn_border_width":"","form_general_bg":"","icon_color_h":"","toggle_txt_color":"","toggle_txt_color_h":"","f_toggle_txt_font_header":"","f_toggle_txt_font_title":"Text","f_toggle_txt_font_settings":"","f_toggle_txt_font_family":"","f_toggle_txt_font_size":"","f_toggle_txt_font_line_height":"","f_toggle_txt_font_style":"","f_toggle_txt_font_weight":"","f_toggle_txt_font_transform":"","f_toggle_txt_font_spacing":"","f_toggle_txt_":"","form_bg":"","form_border_color":"","form_shadow_shadow_header":"","form_shadow_shadow_title":"Shadow","form_shadow_shadow_size":"","form_shadow_shadow_offset_horizontal":"","form_shadow_shadow_spread":"","form_shadow_shadow_color":"","input_color":"","placeholder_color":"","placeholder_opacity":"0","input_bg":"","input_border_color":"","input_shadow_shadow_header":"","input_shadow_shadow_title":"Input shadow","input_shadow_shadow_size":"","input_shadow_shadow_offset_horizontal":"","input_shadow_shadow_offset_vertical":"","input_shadow_shadow_spread":"","input_shadow_shadow_color":"","btn_icon_color":"","btn_icon_color_h":"","btn_border_color":"","btn_border_color_h":"","btn_shadow_shadow_header":"","btn_shadow_shadow_title":"Button shadow","btn_shadow_shadow_size":"","btn_shadow_shadow_offset_horizontal":"","btn_shadow_shadow_offset_vertical":"","btn_shadow_shadow_spread":"","btn_shadow_shadow_color":"","f_input_font_header":"","f_input_font_title":"Input text","f_input_font_settings":"","f_input_font_family":"","f_input_font_size":"","f_input_font_line_height":"","f_input_font_style":"","f_input_font_weight":"","f_input_font_transform":"","f_input_font_spacing":"","f_input_":"","f_placeholder_font_title":"Placeholder text","f_placeholder_font_settings":"","f_placeholder_font_family":"","f_placeholder_font_size":"","f_placeholder_font_line_height":"","f_placeholder_font_style":"","f_placeholder_font_weight":"","f_placeholder_font_transform":"","f_placeholder_font_spacing":"","f_placeholder_":"","f_btn_font_title":"Button text","f_btn_font_settings":"","f_btn_font_family":"","f_btn_font_size":"","f_btn_font_line_height":"","f_btn_font_style":"","f_btn_font_weight":"","f_btn_font_transform":"","f_btn_font_spacing":"","f_btn_":"","results_bg":"","results_border_color":"","results_msg_color":"","results_msg_bg":"","results_msg_border_color":"","f_results_msg_font_header":"","f_results_msg_font_title":"Text","f_results_msg_font_settings":"","f_results_msg_font_family":"","f_results_msg_font_size":"","f_results_msg_font_line_height":"","f_results_msg_font_weight":"","f_results_msg_font_transform":"","f_results_msg_font_spacing":"","f_results_msg_":"","m_bg":"","color_overlay":"","shadow_module_shadow_header":"","shadow_module_shadow_title":"Module Shadow","shadow_module_shadow_size":"","shadow_module_shadow_offset_horizontal":"","shadow_module_shadow_offset_vertical":"","shadow_module_shadow_spread":"","shadow_module_shadow_color":"","title_txt":"","all_underline_height":"","cat_bg":"","cat_bg_hover":"","cat_txt":"","cat_txt_hover":"","cat_border":"","cat_border_hover":"","meta_bg":"","author_txt":"","author_txt_hover":"","date_txt":"","ex_txt":"","com_bg":"","com_txt":"","rev_txt":"","shadow_meta_shadow_header":"","shadow_meta_shadow_title":"Meta info shadow","shadow_meta_shadow_size":"","shadow_meta_shadow_offset_horizontal":"","shadow_meta_shadow_offset_vertical":"","shadow_meta_shadow_spread":"","shadow_meta_shadow_color":"","btn_bg_hover":"","btn_txt":"","btn_txt_hover":"","btn_border_hover":"","f_title_font_header":"","f_title_font_title":"Article title","f_title_font_settings":"","f_title_font_style":"","f_title_font_spacing":"","f_title_":"","f_cat_font_title":"Article category tag","f_cat_font_settings":"","f_cat_font_size":"","f_cat_font_line_height":"","f_cat_font_style":"","f_cat_font_weight":"","f_cat_font_spacing":"","f_cat_":"","f_meta_font_title":"Article meta info","f_meta_font_settings":"","f_meta_font_family":"","f_meta_font_size":"","f_meta_font_line_height":"","f_meta_font_style":"","f_meta_font_transform":"","f_meta_font_spacing":"","f_meta_":"","f_ex_font_title":"Article excerpt","f_ex_font_settings":"","f_ex_font_family":"","f_ex_font_size":"","f_ex_font_line_height":"","f_ex_font_style":"","f_ex_font_weight":"","f_ex_font_transform":"","f_ex_font_spacing":"","f_ex_":"","el_class":"","block_template_id":"","td_column_number":3,"header_color":"","ajax_pagination_infinite_stop":"","offset":"","limit":"5","td_ajax_preloading":"","td_ajax_filter_type":"","td_filter_default_txt":"","td_ajax_filter_ids":"","color_preset":"","ajax_pagination":"","ajax_pagination_next_prev_swipe":"","border_top":"","css":"","class":"tdi_70","tdc_css_class":"tdi_70","tdc_css_class_style":"tdi_70_rand_style"}'; tdbSearchItem.jqueryObj = jQuery('.tdi_70'); tdbSearchItem._openSearchFormClass = 'tdb-drop-down-search-open'; tdbSearchItem._resultsLimit = '6'; tdbSearch.addItem( tdbSearchItem ); }); /* global jQuery:{} */ jQuery().ready(function () { var tdbMenuItem = new tdbMenu.item(); tdbMenuItem.blockUid = 'tdi_78'; tdbMenuItem.jqueryObj = jQuery('.tdi_78'); tdbMenuItem.isMegaMenuFull = true; tdbMenu.addItem(tdbMenuItem); }); jQuery().ready(function () { var tdbSearchItem = new tdbSearch.item(); //block unique ID tdbSearchItem.blockUid = 'tdi_93'; tdbSearchItem.blockAtts = '{"inline":"yes","toggle_txt_pos":"after","form_align":"content-horiz-right","results_msg_align":"content-horiz-center","image_floated":"float_left","image_width":"30","image_size":"td_324x400","show_cat":"none","show_btn":"none","show_date":"","show_review":"","show_com":"none","show_excerpt":"none","show_author":"none","art_title":"0 0 2px 0","all_modules_space":"20","tdicon":"td-icon-magnifier-big-rounded","icon_size":"eyJhbGwiOiIyMCIsInBvcnRyYWl0IjoiMTgifQ==","tdc_css":"eyJhbGwiOnsiZGlzcGxheSI6IiJ9LCJwb3J0cmFpdCI6eyJtYXJnaW4tdG9wIjoiMSIsImRpc3BsYXkiOiIifSwicG9ydHJhaXRfbWF4X3dpZHRoIjoxMDE4LCJwb3J0cmFpdF9taW5fd2lkdGgiOjc2OH0=","modules_on_row":"eyJhbGwiOiI1MCUiLCJwb3J0cmFpdCI6IjUwJSIsImxhbmRzY2FwZSI6IjUwJSJ9","meta_info_horiz":"content-horiz-left","form_width":"600","input_border":"0 0 1px 0","modules_divider":"","form_padding":"eyJwb3J0cmFpdCI6IjIwcHggMjBweCAyMHB4IiwiYWxsIjoiMzBweCJ9","arrow_color":"#ffffff","btn_bg_h":"rgba(0,0,0,0)","btn_tdicon":"td-icon-menu-right","btn_icon_pos":"after","btn_icon_size":"7","btn_icon_space":"8","f_title_font_family":"","f_cat_font_family":"","f_cat_font_transform":"uppercase","f_title_font_weight":"","f_title_font_transform":"","f_title_font_size":"13","title_txt_hover":"#4db2ec","results_limit":"6","float_block":"yes","icon_color":"#000000","results_border":"0 0 1px 0","f_title_font_line_height":"1.4","btn_color":"#000000","btn_color_h":"#4db2ec","all_underline_color":"","results_msg_color_h":"#4db2ec","image_height":"100","meta_padding":"3px 0 0 16px","modules_gap":"20","mc1_tl":"12","show_form":"yes","f_meta_font_weight":"","h_effect":"","results_msg_padding":"10px 0","f_results_msg_font_style":"normal","video_icon":"24","modules_divider_color":"","modules_border_color":"","btn_padding":"0","form_border":"0","form_shadow_shadow_offset_vertical":"3","results_padding":"0 30px 30px","btn_bg":"rgba(0,0,0,0)","icon_padding":"eyJhbGwiOjIuNCwicG9ydHJhaXQiOiIyLjYifQ==","block_type":"tdb_header_search","post_type":"","disable_trigger":"","show_results":"yes","separator":"","disable_live_search":"","exclude_pages":"","exclude_posts":"","search_section_header":"","results_section_1_title":"","results_section_1_taxonomies":"","results_section_1_level":"","results_section_2_title":"","results_section_2_taxonomies":"","results_section_2_level":"","results_section_3_title":"","results_section_3_taxonomies":"","results_section_3_level":"","results_section_search_query_terms":"","results_section_search_query_terms_title":"","results_section_search_query_terms_taxonomies":"","sec_title_space":"","sec_title_color":"","tax_space":"","tax_title_color":"","tax_title_color_h":"","f_sec_title_font_header":"","f_sec_title_font_title":"Section title text","f_sec_title_font_settings":"","f_sec_title_font_family":"","f_sec_title_font_size":"","f_sec_title_font_line_height":"","f_sec_title_font_style":"","f_sec_title_font_weight":"","f_sec_title_font_transform":"","f_sec_title_font_spacing":"","f_sec_title_":"","f_tax_title_font_title":"Taxonomy title text","f_tax_title_font_settings":"","f_tax_title_font_family":"","f_tax_title_font_size":"","f_tax_title_font_line_height":"","f_tax_title_font_style":"","f_tax_title_font_weight":"","f_tax_title_font_transform":"","f_tax_title_font_spacing":"","f_tax_title_":"","toggle_txt":"","toggle_txt_align":"0","toggle_txt_space":"","toggle_horiz_align":"content-horiz-left","form_offset":"","form_offset_left":"","form_content_width":"","form_align_screen":"","input_placeholder":"","placeholder_travel":"0","input_padding":"","input_radius":"","btn_text":"Search","btn_icon_align":"0","btn_margin":"","btn_border":"","btn_radius":"","results_msg_border":"","mc1_title_tag":"","mc1_el":"","m_padding":"","modules_border_size":"","modules_border_style":"","image_alignment":"50","image_radius":"","hide_image":"","show_vid_t":"block","vid_t_margin":"","vid_t_padding":"","vid_t_color":"","vid_t_bg_color":"","f_vid_time_font_header":"","f_vid_time_font_title":"Video duration text","f_vid_time_font_settings":"","f_vid_time_font_family":"","f_vid_time_font_size":"","f_vid_time_font_line_height":"","f_vid_time_font_style":"","f_vid_time_font_weight":"","f_vid_time_font_transform":"","f_vid_time_font_spacing":"","f_vid_time_":"","excl_show":"inline-block","excl_txt":"","excl_margin":"","excl_padd":"","all_excl_border":"","all_excl_border_style":"solid","excl_radius":"","excl_color":"","excl_color_h":"","excl_bg":"","excl_bg_h":"","all_excl_border_color":"","excl_border_color_h":"","f_excl_font_header":"","f_excl_font_title":"Label text","f_excl_font_settings":"","f_excl_font_family":"","f_excl_font_size":"","f_excl_font_line_height":"","f_excl_font_style":"","f_excl_font_weight":"","f_excl_font_transform":"","f_excl_font_spacing":"","f_excl_":"","meta_info_align":"","meta_width":"","meta_margin":"","meta_info_border_size":"","meta_info_border_style":"","meta_info_border_color":"#eaeaea","art_btn":"","modules_category":"","modules_category_margin":"","modules_category_padding":"","modules_cat_border":"","modules_category_radius":"0","modules_extra_cat":"","author_photo":"","author_photo_size":"","author_photo_space":"","author_photo_radius":"","show_modified_date":"","time_ago":"","time_ago_add_txt":"ago","time_ago_txt_pos":"","review_space":"","review_size":"2.5","review_distance":"","art_excerpt":"","excerpt_col":"1","excerpt_gap":"","excerpt_middle":"","btn_title":"","btn_border_width":"","form_general_bg":"","icon_color_h":"","toggle_txt_color":"","toggle_txt_color_h":"","f_toggle_txt_font_header":"","f_toggle_txt_font_title":"Text","f_toggle_txt_font_settings":"","f_toggle_txt_font_family":"","f_toggle_txt_font_size":"","f_toggle_txt_font_line_height":"","f_toggle_txt_font_style":"","f_toggle_txt_font_weight":"","f_toggle_txt_font_transform":"","f_toggle_txt_font_spacing":"","f_toggle_txt_":"","form_bg":"","form_border_color":"","form_shadow_shadow_header":"","form_shadow_shadow_title":"Shadow","form_shadow_shadow_size":"","form_shadow_shadow_offset_horizontal":"","form_shadow_shadow_spread":"","form_shadow_shadow_color":"","input_color":"","placeholder_color":"","placeholder_opacity":"0","input_bg":"","input_border_color":"","input_shadow_shadow_header":"","input_shadow_shadow_title":"Input shadow","input_shadow_shadow_size":"","input_shadow_shadow_offset_horizontal":"","input_shadow_shadow_offset_vertical":"","input_shadow_shadow_spread":"","input_shadow_shadow_color":"","btn_icon_color":"","btn_icon_color_h":"","btn_border_color":"","btn_border_color_h":"","btn_shadow_shadow_header":"","btn_shadow_shadow_title":"Button shadow","btn_shadow_shadow_size":"","btn_shadow_shadow_offset_horizontal":"","btn_shadow_shadow_offset_vertical":"","btn_shadow_shadow_spread":"","btn_shadow_shadow_color":"","f_input_font_header":"","f_input_font_title":"Input text","f_input_font_settings":"","f_input_font_family":"","f_input_font_size":"","f_input_font_line_height":"","f_input_font_style":"","f_input_font_weight":"","f_input_font_transform":"","f_input_font_spacing":"","f_input_":"","f_placeholder_font_title":"Placeholder text","f_placeholder_font_settings":"","f_placeholder_font_family":"","f_placeholder_font_size":"","f_placeholder_font_line_height":"","f_placeholder_font_style":"","f_placeholder_font_weight":"","f_placeholder_font_transform":"","f_placeholder_font_spacing":"","f_placeholder_":"","f_btn_font_title":"Button text","f_btn_font_settings":"","f_btn_font_family":"","f_btn_font_size":"","f_btn_font_line_height":"","f_btn_font_style":"","f_btn_font_weight":"","f_btn_font_transform":"","f_btn_font_spacing":"","f_btn_":"","results_bg":"","results_border_color":"","results_msg_color":"","results_msg_bg":"","results_msg_border_color":"","f_results_msg_font_header":"","f_results_msg_font_title":"Text","f_results_msg_font_settings":"","f_results_msg_font_family":"","f_results_msg_font_size":"","f_results_msg_font_line_height":"","f_results_msg_font_weight":"","f_results_msg_font_transform":"","f_results_msg_font_spacing":"","f_results_msg_":"","m_bg":"","color_overlay":"","shadow_module_shadow_header":"","shadow_module_shadow_title":"Module Shadow","shadow_module_shadow_size":"","shadow_module_shadow_offset_horizontal":"","shadow_module_shadow_offset_vertical":"","shadow_module_shadow_spread":"","shadow_module_shadow_color":"","title_txt":"","all_underline_height":"","cat_bg":"","cat_bg_hover":"","cat_txt":"","cat_txt_hover":"","cat_border":"","cat_border_hover":"","meta_bg":"","author_txt":"","author_txt_hover":"","date_txt":"","ex_txt":"","com_bg":"","com_txt":"","rev_txt":"","shadow_meta_shadow_header":"","shadow_meta_shadow_title":"Meta info shadow","shadow_meta_shadow_size":"","shadow_meta_shadow_offset_horizontal":"","shadow_meta_shadow_offset_vertical":"","shadow_meta_shadow_spread":"","shadow_meta_shadow_color":"","btn_bg_hover":"","btn_txt":"","btn_txt_hover":"","btn_border_hover":"","f_title_font_header":"","f_title_font_title":"Article title","f_title_font_settings":"","f_title_font_style":"","f_title_font_spacing":"","f_title_":"","f_cat_font_title":"Article category tag","f_cat_font_settings":"","f_cat_font_size":"","f_cat_font_line_height":"","f_cat_font_style":"","f_cat_font_weight":"","f_cat_font_spacing":"","f_cat_":"","f_meta_font_title":"Article meta info","f_meta_font_settings":"","f_meta_font_family":"","f_meta_font_size":"","f_meta_font_line_height":"","f_meta_font_style":"","f_meta_font_transform":"","f_meta_font_spacing":"","f_meta_":"","f_ex_font_title":"Article excerpt","f_ex_font_settings":"","f_ex_font_family":"","f_ex_font_size":"","f_ex_font_line_height":"","f_ex_font_style":"","f_ex_font_weight":"","f_ex_font_transform":"","f_ex_font_spacing":"","f_ex_":"","el_class":"","block_template_id":"","td_column_number":3,"header_color":"","ajax_pagination_infinite_stop":"","offset":"","limit":"5","td_ajax_preloading":"","td_ajax_filter_type":"","td_filter_default_txt":"","td_ajax_filter_ids":"","color_preset":"","ajax_pagination":"","ajax_pagination_next_prev_swipe":"","border_top":"","css":"","class":"tdi_93","tdc_css_class":"tdi_93","tdc_css_class_style":"tdi_93_rand_style"}'; tdbSearchItem.jqueryObj = jQuery('.tdi_93'); tdbSearchItem._openSearchFormClass = 'tdb-drop-down-search-open'; tdbSearchItem._resultsLimit = '6'; tdbSearch.addItem( tdbSearchItem ); }); jQuery(window).on( 'load', function () { var block = jQuery('.tdi_113'), blockClass = '.tdi_113', blockInner = block.find('.tdb-block-inner'), blockOffsetLeft; if( block.find('audio').length > 0 ) { jQuery(blockClass + ' audio').mediaelementplayer(); } if( block.hasClass('tdb-sfi-stretch') ) { jQuery(window).resize(function () { blockOffsetLeft = block.offset().left; if( block.hasClass('tdb-sfi-stretch-left') ) { blockInner.css('margin-left', -blockOffsetLeft + 'px'); } else { blockInner.css('margin-right', -(jQuery(window).width() - (blockOffsetLeft + block.outerWidth())) + 'px'); } }); jQuery(window).resize(); } setTimeout(function () { block.css('opacity', 1); }, 500); }); </script> </body> </html>